这是 next() 提供的IteratorArrayList.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上进行了迭代,这是有史以来最常见的操作之一)。

09-25 20:40