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];
}