ArrayList的遍历方法有多种,本文主要对Iterator、ListIterator两种迭代器的源码进行分析。
一、iterator() 源码分析
public Iterator<E> iterator() {
return new Itr();
}
iterator() 方法返回的是一个内部类Itr,接下来看看Itr的内容:
private class Itr implements Iterator<E> {
// 下个元素的索引
int cursor; // index of next element to return
// 上个元素的索引,个人理解为当前操作元素的下标
int lastRet = -1; // index of last element returned; -1 if no such
// 集合被修改的次数(modeCount),单线程情况下,二者是恒等的
int expectedModCount = modCount;
Itr() {
}
// 是否有下个元素
public boolean hasNext() {
return cursor != size;
}
// 获取元素,每次调用next()方法前,先调用hasNext()方法,否则可能会有异常抛出
@SuppressWarnings("unchecked")
public E next() {
// 检查是否有其他线程修改集合
checkForComodification();
int i = cursor;
// 下标检查
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new Conc