9

ArrayListsを理解していれば、配列がいっぱいになると自動的にサイズが変更される配列に支えられています。clear()を呼び出すと、ArrayListは可能な限り最小の配列サイズにサイズ変更されますか?

4

4 に答える 4

13

いいえ、そうではありません。これは覚えておくべき問題です。ArrayListの内部Object[]が1000000要素まで増加したと仮定します。ここで、ArrayList.clear()を呼び出します。これにより、すべての1000000要素がnullに設定され、内部サイズが0に設定されます。1000000をnullにすることは時間のかかる操作であり、ArrayListはヒープ上で1000000x4バイトのObject[]を占有します。clear()の後にArrayList.trimToSize()を呼び出すことができますが、落とし穴があります。最初に1000000個の要素をクリアしてから、それらを破棄しました。この状況では、はるかに優れた解決策は、ArrayList(new ArrayList())を再作成することです。

于 2012-12-22T13:50:05.877 に答える
1

サイズは0に設定されていますが、明示的に発生するサイズ変更はありません
。実際のコードは次のとおりです。

     public void  clear() {
         modCount++;
         // Let gc do its work
         for (int i = 0; i < size; i++)
             elementData[i] = null;
         size = 0;
     }

このリンクを確認してください。

于 2012-12-22T09:53:08.973 に答える
0

サイズはゼロに設定されます。arrayList.clear()arraylistに含まれるすべてのオブジェクトをnullに設定します。ただし、これは、arraylistに含まれるすべてのオブジェクトがガベージコレクションされることを保証するものではありません。他の場所に参照があるオブジェクトは、すべての参照が削除されるまでガベージコレクションされません。

于 2012-12-22T09:52:21.377 に答える
0

サイズを小さくするには、クリアした後にtrimToSize()を使用する必要があります。多くのMBを節約しようと配列しない限り、大きな違いはないため、通常、これは実行されません。より一般的な解決策は、そのような状況でArrayListを置き換えることです。(私はそれが良いと言っているのではありません)

于 2012-12-22T11:13:42.590 に答える