私は単純な疑問を持っています.Arraylistは、いっぱいになったときに係数(2,1.5またはold_capacity * 3/2 +1など)でサイズを増やし、新しい要素を追加します。次に、数値が何らかの要因によって削除された場合、サイズを動的に縮小しないのはなぜですか。arraylistに10000個の要素があり、特定の時点ですべての要素が削除された場合のように、配列リストには100個の要素しかありません.10000個のオブジェクトメモリを保持しています. なぜ、trimTosize() などを呼び出さなければならないのですか? なぜそれは彼らの自動的ではないのですか?私は何か見落としてますか .. ?どうすればいいのか教えてください。なぜそれをしなければならないのか知りたいです?? ありがとう
3 に答える
次に、数値が何らかの要因によって削除された場合、サイズを動的に縮小しないのはなぜですか。
パフォーマンス上の理由から。メモリの割り当ては、常に高価な操作です。割り当てを解除しないことの背後にあるロジックは、データ構造が特定のサイズに達した場合、要素を削除したとしても、将来そのサイズに再び達する可能性があるということです。
以前に割り当てられたメモリのチャンク全体を解放し、サイズ変更された構造体の新しいチャンクを再割り当てする必要がある場合があるため、割り当て解除も高価になる可能性があります (これは実装によって異なりますが、一般的には true です。C のreallocを参照してください)。
がいっぱいで、新しい要素を追加したい場合、ArrayList
サイズを大きくする以外に方法はありません。エントリを削除してサイズが小さくなった場合、実際にサイズを変更する必要はありません。そのサイズのままにしておくと、パフォーマンスが向上します。そろそろ新しいアイテムが追加されるかも?
小さくしたい場合は、引き続き使用できますtrimToSize()
。
したがって、サイズを自動的に大きくすることは理にかなっていますが、自動的に小さくすることはできません。
たとえば、100 万人のメンバーを含むリストがあり、その 1 つを削除した場合、999,999 個の参照を新しい配列に本当にコピーしたいのでしょうか?
編集:コメントの懸念に対処するために-コレクションが「自動的に」サイズ変更されるしきい値を持つことの問題は、パフォーマンス管理が困難になることです。
配列リストから要素を削除すると、その操作に一定の時間がかかります。499,999 回目の削除には、500,000 回目の削除と同様の時間がかかるはずです。ある時点でコレクションのサイズを本当に変更したい場合は、提供されたメソッドを使用してそれを行うことができますが、それは私の制御下にあります。