7

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#473

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) } ガベージ コレクションの対象にするには? O(n) のパフォーマンスclear()があまり良くないように思えますか、それとも何か不足していますか?

4

4 に答える 4

9

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

clear()配列全体を解放した場合、それ自体の呼び出しと再割り当ての間にほとんど違いはありませんArrayList。アレイを再利用するか、新しいアレイに置き換えるかを選択できるようになりました。

于 2013-08-14T13:13:40.033 に答える
2

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

また、ここでは JIT コンパイルが重要であることに注意してください。ループは非常にキャッシュにやさしく、個々の操作は非常に安価です。おそらく、コンパイルされたケースでは、それぞれに対して 1 つのマシン命令だけです。

于 2013-08-14T13:22:30.530 に答える