本文主要讲解迭代器模式在Vector源码中的使用。参考的JDK版本为1.8。
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象中的各个元素,而不用暴露这个对象的内部表示。在Java中,Vector的迭代器有两种:Iterator和ListIterator。值得一提的是,elements()方法也能实现类似迭代器的效果。为什么已经有了迭代器,还特意在Vector中新增了elements()呢?在文章最后会作出解释。
Iterator
迭代器是一个用来遍历并选择序列中的对象。Java的Iterator的只能单向移动。
例子
在写如何实现之前,先看一个使用迭代器Iterator的小例子:
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
public class ItrOfVectorTest {
@org.junit.Test
public void test() {
List list = new Vector<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String str = (String) iterator.next();
System.out.println(str);
iterator.remove();
}
System.out.println(list.size());
}
}
运行结果
1
2
3
4
0
方法
- iterator(),list.iterator()用来从容器对象中返回一个指向list开始处的迭代器。
- next(),获取序列中的下个元素。
- hasNext(),检查序列中向下是否还有元素。
- remove(),将迭代器最近返回的一个元素删除。这也意味着调用remove()前需要先调用next()。
实现
在设计模式(16)-迭代器模式这一文章中曾讲过,迭代器模式中有四个角色:
- 抽象聚合类Aggregate。在Vector的Iterator迭代器实现中,没有抽象聚合类。虽然它实现了AbstractList,实现了List,但它向外部提供的创建迭代器的方法iterator()是它自己的。
- 具体聚合类ConcreteAggregate。在Vector的Iterator迭代器实现中,指的是Vector。
- 抽象迭代器Iterator。在Vector的Iterator迭代器实现中,指的是Iterator接口。
- 具体迭代器ConcreteIterator。在Vector中的Iterator迭代器实现中,指的是Itr。
Vector代码片段
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
/**
* 保存vector中元素的数组。vector的容量是数组的长度,数组的长度最小值为vector的元素个数。
*
* 任何在vector最后一个元素之后的数组元素是null。
*
* @serial
*/
protected Object[] elementData;
/**
* vector中实际的元素个数。
*
* @serial
*/
protected int elementCount;
/**
* vector需要自动扩容时增加的容量。
*
* 当vector的实际容量elementCount将要大于它的最大容量时,vector自动增加的容量。
*
* 如果capacityIncrement小于或等于0,vector的容量需要增长时将会成倍增长。
* @serial
*/
protected int capacityIncrement;
/**
* 序列版本号
*/
private static final long serialVersionUID = -2767605614048989439L;
/**
* 返回一个用来遍历Vector元素的Iterator迭代器
*
* 返回的迭代器是fail-fast的
*/
public synchronized Iterator<E> iterator() {
return new Itr();
}
/**
* AbstractList.Itr的最优化的版本
*/
private