11.JAVA中的容器
为什么要使用集合类?
当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。集合类存放的都是对象的引用,而非对象本身(String是个特例)。
集合类可分为两大类,分别继承Collection和Map接口
Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。
Map:
不能包括两个相同的键,一个键最多能绑定一个值(如相同后一个覆盖前一个)。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的
继承Map的类有:HashMap,HashTable,TreeMap
HashMap:缺省情况下是非同步的。
HashTable:缺省是线程同步的。不允许关键字或值为null。
TreeMap:此实现是非同步的。可以放入比较器 TreeMap(Comparator<? super K> comparator)实现自定义排序。
当元素的顺序很重要时选用TreeMap,TreeMap类不仅实现了Map接口,还实现了Map接口的子接口java.util.SortedMap。当元素不必以特定的顺序进行存储时,使用HashMap。不推荐使用Hashtable,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以通过MapCollections.synchronizedMap(Map m)来达到线程同步 。
Collection:
Collection是List和Set两个接口的基接口
List在Collection之上增加了"有序" ,List允许有相同的元素。
Set在Collection之上增加了"唯一"
List接口
List是有序的Collection,允许有相同的元素。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
LinkedList类
LinkedList实现了List接口,LinkedList采用是链表,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Set接口
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
实现List接口的常用类有HashSet和TreeSet
HashSet类:无序,唯一。
TreeSet类:可以放入比较器 TreeSet(Comparator<? super E> comparator)实现自定义排序。
容器的迭代和遍历
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入元素。
迭代器应用: list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for (Iterator iter = l.iterator(); iter.hasNext();) { String str = (String)iter.next(); System.out.println(str); } /*迭代器用于while循环 Iterator iter = l.iterator(); while(iter.hasNext()){ String str = (String) iter.next(); System.out.println(str); }public static void iterManipulation(List a){ ListIterator it = a.listIterator(); for(int i=1; i<=a.size();i++){ System.out.println(it.nextIndex()+"--->"+it.next()); } System.out.println("--------------------------------"); while(it.hasPrevious()){ System.out.println(it.previousIndex()+"------>"+it.previous()); } }