以下是ArrayList.iterator()
提供的next()
中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
复制到内部类迭代器中,因为内部类可以访问外部类中的字段?对于一个庞大的名单来说,这将是非常昂贵的。
我知道这段代码背后一定有解释 - 它是什么?
答案 0 :(得分:3)
我的问题是为什么JDK尝试将整个数据数组复制到内部类迭代器中。对于一个庞大的名单来说,这将是非常昂贵的。
不,不是。它将引用复制到数组,而不是数组本身。那总是O(1);根本不贵。
通常必须以elementData
访问 Itr.outerClass.elementData
,其中outerClass
是内部类携带到外部的隐式引用,因此此更改减少了间接引用的数量和引用得到遵循(少量,但它是迭代ArrayList
,它是有史以来最常见的操作之一。)