2016-07-15 8 views
3

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をコピーしようとしません外部クラスのフィールドにアクセスできますか?それは巨大なリストのために本当に高価になるでしょう。

私はこのコードの背後に説明があることがわかります - それは何ですか?

答えて

3

私の質問は、JDKが内部クラスイテレータにデータ配列全体をコピーしようとする理由です。それは巨大なリストのために本当に高価になるでしょう。

いいえ、そうではありません。 参照を配列にコピーし、配列自体にはコピーしません。それは常にO(1)です。全く高価ではありません。

elementDataは通常outerClassが内部クラスの暗黙的な参照された状態で、Itr.outerClass.elementDataとしてアクセスしなければならない外に運ぶので、この変化は、小さな量(続き得る間接および参照の数を減少させるが、それはですArrayListを反復することはこれまでの最も一般的な操作の1つです)。

+0

あなたは正しいです。なぜその操作ですか?再度elementDataの長さもチェックします。 – shen

+0

@weiShenは、私が言ったように、 'Itr.outerClass.elementData'を2回実行するのではなく、一度それを見て、それを直接使うことができ、' Itr.outerClass'の余分な参照を節約することを意味します。 –

+0

おそらく、 'getField'の節約のためです(' next'はかなりの回数呼び出されることに注意してください)。 –

関連する問題