はArrayList.iterator()
によって提供Iterator
におけるnext()
メソッドのソースコードである:ArrayListのIterator.next()メソッドがelementDataフィールドをコピーするのはなぜですか?ここ
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
をコピーしようとしません外部クラスのフィールドにアクセスできますか?それは巨大なリストのために本当に高価になるでしょう。
私はこのコードの背後に説明があることがわかります - それは何ですか?
あなたは正しいです。なぜその操作ですか?再度elementDataの長さもチェックします。 – shen
@weiShenは、私が言ったように、 'Itr.outerClass.elementData'を2回実行するのではなく、一度それを見て、それを直接使うことができ、' Itr.outerClass'の余分な参照を節約することを意味します。 –
おそらく、 'getField'の節約のためです(' next'はかなりの回数呼び出されることに注意してください)。 –