1. 集合的存在
数组和集合都可以当作容器,用来存储数据,但是数组的长度固定,不适用于存储数量未知的数据。
2. 集合框架
虽然还有一些遗漏的类或者接口,但可以从图中明显看出,java集合分为两大类,一种是实现了Collection接口的集合,从而引出其子类,List、Set、Queue,以及其更为高级的子类或者实现类,ArrayList、LinkedList等等;另一种是实现了Map接口的集合,包括HashMap、Hashtable等等。
3. 迭代器Iterator
3.1 含义
与集合密切相关的就是迭代器Iterator了,主要用来遍历集合中的元素。查看Collection源码可以发现,它是继承自Iterable接口的,Iterable接口中有一个方法返回一个迭代器:Iterator< T> iterator(); Collection继承了这个接口就可以使用迭代器了。这里不禁让人产生一个疑惑,为什么Collection不直接继承Iterator接口,而是要多定义一个Iterable接口,让Collection去继承Iterable,而不是Iterator呢? 如果让Collection直接继承Iterator接口,这样Collection本身就变成了一个迭代器了,它有next方法,hasNext方法,也就是说Collection包含着当前迭代的位置(状态),先不说多线程的情况了,就是单线程,如果一个方法遍历Collection,遍历了一半突然终止了,那么Collection中迭代的位置就在中间。而另一个方法接着遍历它,却发现只能遍历后一半的内容,前一半遍历不到,因为Iterator没有提供重置迭代位置的方法。而继承Iterable就不同了,它有一个iterator()方法,它能保证每一次调用iterator()方法,都能返回一个新的迭代器,不同的迭代器之间是互不影响的。这里我们看下ArrayList对于iterator方法的实现:
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E>{
......
}
每一次调用iterator()方法都会new一个新的迭代器
3.2 Iterator与ListIterator
ListIterator是List接口类集合特有的迭代器,继承自Iterator接口,除了继承了Iterator接口的next、hasNext、remove方法外,还具有hasPrevious、previous、nextIndex、previousIndex、set、add方法。通过它特有的这些方法,就可以知道它与Iterator有如下区别:
(1)Iterator只能遍历与删除,而ListIterator还可以添加和修改
(2)Iterator只能向后遍历,而ListIterator拥有hasPrevious、previous方法,还可以向前遍历
(3)ListIterator拥有nextIndex、previousIndex方法,可以定位到当前迭代器遍历的位置
4. Collections与Collection
上面说了,Collection是一个集合接口,而Collections类似一个集合的工具类,里面包含了很多静态方法,比如排序、比较大小等等