次のように、明確なメソッドである Java ハッシュ マップを見ました。
public void clear() {
modCount++;
Entry[] tab = table;
for (int i = 0; i < tab.length; i++)
tab[i] = null;
size = 0;
}
なぜ新しいタブをクリアする必要があるのか わかりません。
テーブルを使ってクリアしてみませんか?
なぜ新しいタブをクリアするのかわかりません。
これは新しいテーブルではありません...それは単なるローカル変数です。
私は3つの考えられる理由を考えることができます:
@Bhesh Gurungが示唆しているように、読みやすさ...ここではほとんど違いはありませんが(IMO)。
clear()
1つのスレッドが呼び出し、2番目のスレッドが更新を実行してテーブルが拡張される可能性がある場合に発生する損傷を(ある程度)軽減する可能性があります。しかし、それは確かに問題を解決しないので、私はこれを無意味であるとして却下する傾向があります。
パフォーマンスが向上する可能性があります。たとえば、オプティマイザはローカル変数の参照をtab
変更できないことを知っているため、配列の境界チェックをより適切に最適化できます。
これらのうち、3番目の理由が最も妥当だと思います。
(モディファイアとは何の関係もないと思いますtransient
。この場合、モディファイアは読みやすさのためだけにあります。HashMap
クラスが提供readObject
しwriteObject
、transient
モディファイアを無効にします。)
table
フィールドが として宣言されているためtransient
、HashMap オブジェクトの永続状態の一部ではない可能性があります。フィールドは、同期されていない のtable
ようなメソッドで置き換えられるため、メソッド呼び出し内のすべてのエントリを反復処理するときに、フィールドが下から交換される可能性があります。firstへの参照を作成し、その参照を繰り返し処理する場合、フィールドが変更された場合でも元の を繰り返し処理していることが保証されます。resize()
table
clear()
table
table
table