在实际编程当中,很多时候我们要把数据暂时储存起来,以便实现某种特定的功能。在纯C语言中,我们需要自己去实现一个数据结构(如链表、队列等)来进行元素的存取,不仅繁琐,而且效率也不高(类库对数据结构的封装往往都是优化过的,有着较好的性能)。在Java中,我们可以使用对象容器(Container)来方便地存取数据。
1、List接口(List interface)
List接口是java.util.Collction接口的子接口,它在Collection接口的基础上增加了根据索引获取对象的方法。因此List结构的特定是,每个加入List中的元素是按顺序加入的,并可指定索引存取元素,类似于数组。
ArrayList是实现了List接口的类,ArrayList使用数组结构来实现List数据结构。所以对于需要频繁随机访问对象的操作来说,ArrayList可以获得较好的效率,但如果进行删除、添加,效率就会很低,因为ArrayList内部需要移动大量的元素。下面是使用ArrayList的一个示例:
package cls; import java.util.*; /** * ArrayList数组测试 * 2013.3.22 **/ public class ArrayListTest { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); Scanner scan = new Scanner(System.in); while(true) { String input = scan.next(); if(input.equals("q")) break; list.add(input); //使用add()方法添加元素 } // 使用迭代器遍历输出 Iterator it = list.iterator(); while(it.hasNext()) System.out.println(it.next()); } }
LinkedList类用链表实现了List接口。这就意味着LinkedList在进行添加、删除、插入操作时会获得较好的效率。但对于存取操作,则不如ArrayList效率高。
我们可以使用LinkedList来实现栈(Strack),队列(Queue_)等数据结构 。如:
package cls; import java.util.*; /** * 用LinkedList实现栈 * 2013.3.22 **/ public class LinkedListStack { LinkedList<String> list; public LinkedListStack() { this.list = new LinkedList<String>(); } public void push(String str) //压栈 { list.addFirst(str); } public String top() { return list.getFirst(); } public String pop() //出栈 { return list.removeFirst(); } public boolean isEmpty() { return list.isEmpty(); } public static void main(String[] args) { LinkedListStack stack = new LinkedListStack(); Scanner sc = new Scanner(System.in); String str; while(true) { str = sc.next(); if(str.equals("q")) break; stack.push(str); //压栈 } while(!stack.isEmpty()) System.out.println(stack.pop()); } }
package cls; import java.util.*; /** * 用LinkedList实现队列 * 2013.3.22 **/ public class LinkedListQueue { public static void main(String[] args) { LinkedList<String> Q = new LinkedList<String>(); Scanner sc = new Scanner(System.in); String str; while(true) { str = sc.next(); if(str.equals("q")) break; // offer() 入队 Q.offer(str); } // poll();取得并删除队列中的元素 // 队列为空时返回null while((str = Q.poll()) != NULL) { System.out.println(str); } } }
2、Set接口
Set接口也是Collection的子接口。但List容器中的对象允许重复,但Set容器中的对象必须都是唯一的。
HashSet类实现了Set接口。HashSet使用哈希法对元素进行插入、排序等操作,因而能够高效地查找,插入。如:
package cls; import java.util.*; /** * 使用HashSet进行快速查找、插入操作 * 2013.3.22 **/ public class HashSetTest { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); Scanner sc = new Scanner(System.in); String str; while(true) //插入元素 { str = sc.next(); if(str.equals("quit")) break; set.add(str); } while(true) //查找元素 { str = sc.next(); if(str.equals("quit")) break; // 调用contains()方法查找是否存在该元素 if(set.contains(str)) System.out.println("Yes"); else System.out.println("No"); } } }
3、SortedSet接口
SortedSet是实现了排序功能的接口,实现该接口的类都是有序的。
TreeSet是Java SE中唯一实现SortedSet接口的类,它使用红黑树结构来对插入的元素进行排序。如将输入的字符串按字典序输出 :
package cls; import java.util.*; /** * 使用TreeSet类实现排序 * 2013.3.22 **/ public class TreeSetTest { public static void main(String[] args) { /** * 使用TreeSet的默认方式进行排序 **/ TreeSet<String> set = new TreeSet<String>(); set.add("zoo"); set.add("bird"); set.add("pear"); set.add("iPod"); // 使用 enhanced for loop 显示排序后的对象 for(String str : set) System.out.println(str); System.out.println("----------------------------------------"); /** * 使用自定义方式进行排序 **/ Set<String> s = new TreeSet<String>(new TreeSetCustom()); s.add("zoo"); s.add("bird"); s.add("pear"); s.add("iPod"); for(String str : s) System.out.println(str); } } /** * 自定义排序规则进行排序 * 2013.3.22 **/ class TreeSetCustom implements Comparator { public int compare(Object o1,Object o2) { // 反字典序 return ((String)o1).compareTo((String)o2) * (-1); } }
我们还可以自定义排序的规则,以适应在实际应用中的实际需要。要定义自己的排序规则,必须定义一个实现java.util.Comparator接口的对象,实现该接口中的comare()方法。如上例
4、Map接口
实现 java.util.Map接口的对象会将键(key)映射至值(value)。 在将对象存入map中时,需要同时给定一个键,在取回对象时指定键。Map中的每一个键都是唯一的,不得重复。
HashMap实现了Map接口。HashMap在内部使用哈希法,因些能得到很高的查找效率。如:
package cls; import java.util.*; /** * 使用HashMap类实现key - value 的存储结构 * 2013.3.22 **/ public class HashMapTest { public static void main(String[] args) { HashMap<String,String> set = new HashMap<String,String>(); // put([key],[value]); set.put("animal","cat"); set.put("food","hotdog"); System.out.println(set.get("animal")); System.out.println(set.get("food")); } }
TreeMap也实现了Map接口,它使用红黑树对插入的对象进行排序。它的操作与HashMap类似,在此不再赘述。。
PS:学完这章,就一个感觉---碉堡了!!