Collection是java最基本的接口,一个Collection代表一组Object。JDK不直接提供Collection的接口,而是提供继承自Collection的子接口 如List、Set。
有些Collection支持排序,有些不支持;有些可以允许元素相同,有些则不允许。
不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
由Collection接口派生的两个接口是List和Set。
2.1 List接口
List是有序的Collection,允许有相同元素。
实现List接口的常用类有LinkedList、ArrayList、Vector和Stack。
2.1.1 LinkedList类
LinkedList实现了List接口,允许null元素。LinkedList提供额外的get、remove、insert方法在LinkedList的首部和尾部,这些操作可以使LinkedList可被用作堆栈、队列或双向队列。
无同步、多线程访问需要自己同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));
2.1.2 ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
2.1.3 Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和 ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使 用,另一个线程改变了 Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。
2.1.3.1Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈 是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
2.1.4Set接口
Set是一种不包含重复的元素的Collection,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
3、Map接口
Map没有继承Collection接口。一个Map中不能包含相同的key。
Map.Entry 接口
Map 的 entrySet() 方法返回一个实现Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键-值对。
通过这个集合迭代,您可以获得每一条目的键或值并对值进行更改。但是,如果底层 Map 在Map.Entry 接口的setValue() 方法外部被修改,此 条目集就会变得无效,并导致迭代器行 为未定义。