为什么ArrayList的Iterator.next()方法复制elementData字段?

时间:2016-07-15 21:23:59

标签: java arraylist iterator

以下是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复制到内部类迭代器中,因为内部类可以访问外部类中的字段?对于一个庞大的名单来说,这将是非常昂贵的。

我知道这段代码背后一定有解释 - 它是什么?

1 个答案:

答案 0 :(得分:3)

  

我的问题是为什么JDK尝试将整个数据数组复制到内部类迭代器中。对于一个庞大的名单来说,这将是非常昂贵的。

不,不是。它将引用复制到数组,而不是数组本身。那总是O(1);根本不贵。

通常必须以elementData访问

Itr.outerClass.elementData,其中outerClass是内部类携带到外部的隐式引用,因此此更改减少了间接引用的数量和引用得到遵循(少量,但它是迭代ArrayList它是有史以来最常见的操作之一。)