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

Java 为什么ArrayList的Iterator.next()方法复制elementData字段?,java,arraylist,iterator,Java,Arraylist,Iterator,以下是由以下人员提供的Iterator中的next()方法的源代码: 既然内部类可以访问外部类中的字段,为什么来自JDK的代码会尝试将整个数据数组elementData复制到内部类迭代器中?对于一个庞大的列表来说,这将是非常昂贵的 我知道这段代码背后一定有一个解释——它是什么 我的问题是为什么JDK试图将整个数据数组复制到内部类迭代器中。对于一个庞大的列表来说,这将是非常昂贵的 不,不是。它将引用复制到数组,而不是数组本身。这总是O(1);一点也不贵 elementData通常必须作为Itr.o

以下是由以下人员提供的
Iterator
中的
next()
方法的源代码:

既然内部类可以访问外部类中的字段,为什么来自JDK的代码会尝试将整个数据数组
elementData
复制到内部类迭代器中?对于一个庞大的列表来说,这将是非常昂贵的

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

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

不,不是。它将引用复制到数组,而不是数组本身。这总是O(1);一点也不贵


elementData
通常必须作为
Itr.outerClass.elementData
访问,
outerClass
是内部类携带到外部的隐式引用,因此此更改减少了间接引用和后续引用的数量(虽然数量很少,但它是在
ArrayList
上迭代的,这是有史以来最常见的操作之一).

你是对的。但是为什么要这样做呢?他们还会再次检查elementData的长度。@weiShen,就像我说的,这意味着他们不必做两次
Itr.outerClass.elementData
,而是查找一次,然后可以直接使用它,从而保存
Itr.outerClass
的额外解引用。这可能是为了保存
getField
(请记住,
next
预计会被调用很多次)。@jornverne我不确定我觉得这个参数是否有说服力;ArrayList不是线程安全的。我认为原因与
String#hashCode()的原因相同:
char val[]=value;
(正在获取复制到局部变量中的引用)。瞧,@LouisWasserman是对的;)
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];
}