这是 next()
提供的Iterator
中ArrayList.iterator()
方法的源代码:
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
// Why copy the entire elementData from the outer ArrayList class?
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
由于内部类可以访问外部类中的字段,因此JDK中的这段代码为什么尝试将整个数据数组
elementData
复制到内部类迭代器中?对于庞大的清单来说,这确实是昂贵的。我知道此代码后面必须有解释-这是什么?
最佳答案
我的问题是为什么JDK尝试将整个数据数组复制到内部类迭代器中。对于庞大的清单来说,这确实是昂贵的。
不,不是。它将引用复制到数组,而不是数组本身。那总是O(1);一点也不贵。elementData
通常必须以Itr.outerClass.elementData
的形式进行访问,其中outerClass
是内部类对外部进行的隐式引用,因此此更改减少了所遵循的间接引用和引用的数量(虽然很少,但它在ArrayList
上进行了迭代,这是有史以来最常见的操作之一)。