2013-08-14 7 views
7

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#473java.util.Arraylist#clearがOpenJDKのように実装されたのはなぜですか?

public void clear() { 
    modCount++; 

    // Let gc do its work 
    for (int i = 0; i < size; i++) 
     elementData[i] = null; 

    size = 0; 
} 

私の質問です、なぜ彼らは、彼らは単に補助配列を再初期化していることができるときガベージコレクションの対象の各要素を作るために補助配列{O(N)}を通じてサイクルを行う必要がありました、配列全体への参照を{O(1)}全体として破棄し、ガベージコレクションの対象にするのか? clear()のO(n)のパフォーマンスは、私にはあまりいいとは思われません。

+2

[list.clear()対list = new ArrayList ();]の可能な複製(http://stackoverflow.com/questions/6961356/list-clear-vs-list-new-arraylistinteger) – Tala

+0

私はしないでくださいこれは重複していると思う。 – nawfal

答えて

9

これを実行すると、バッキングストレージを再割り当てせずにアレイを再利用できます。 ArrayListの表現は主にバッキングストレージで構成されているため、配列を再割り当てしたい場合は、それを自分で行うことができます。

アレイ全体をリリースした場合は、clear()を呼び出してArrayListを再割り当てするとほとんど違いがありません。今では、アレイを再利用するか、まったく新しいものに置き換えるかを選択するオプションが用意されています。

+0

ほぼ同じように、 'for(loop_through_list as e){e = null}' //擬似コード –

+1

@SayoOladejiしかし、それはループを必要とし、要素を 'null'に設定するたびにチェックします。 'new ArrayList()'を実行すると、ループのための1行ではなく、1行を1行で交換します。 – dasblinkenlight

+0

今、私は無邪気に見える 'def arr = new Object [n]'の全く異なる視点を持っています ありがとう! –

2

ArrayListをクリア()している場合は、明らかに再利用するつもりであるため、再利用で同じ数のオブジェクトが存在する可能性があります。だから、サイズ変更操作を避けることは良い考えのようです。

また、ここではJITコンパイルの問題ことを念頭に、裸、潜在的に多くの - そのループがになるだろう極めてキャッシュ優しい&個々の操作は非常に安いです - コンパイルされた場合のそれぞれについて、おそらくちょうど単一のマシン命令。

0

Java Generational Garbage Collectionであるclear() impl in Java's LinkedListと同じ理由です。

このArrayListおよびバッキングアレイは、若い世代にある可能性の高い配列インデックスによって参照されるオブジェクトを保持できる「古い世代」に昇格される可能性が高くなります。すべての索引をNULLに設定すると、バッキング配列が収集される前に、より若いオブジェクトを収集することができます。

関連する問題