7

次のように、明確なメソッドである Java ハッシュ マップを見ました。

public void clear() {
    modCount++;
    Entry[] tab = table;
    for (int i = 0; i < tab.length; i++)
        tab[i] = null;
    size = 0;
}

なぜ新しいタブをクリアする必要があるのか​​ わかりません。

テーブルを使ってクリアしてみませんか?

4

2 に答える 2

4

なぜ新しいタブをクリアするのかわかりません。

これは新しいテーブルではありません...それは単なるローカル変数です。

私は3つの考えられる理由を考えることができます:

  • @Bhesh Gurungが示唆しているように、読みやすさ...ここではほとんど違いはありませんが(IMO)。

  • clear()1つのスレッドが呼び出し、2番目のスレッドが更新を実行してテーブルが拡張される可能性がある場合に発生する損傷を(ある程度)軽減する可能性があります。しかし、それは確かに問題を解決しないので、私はこれを無意味であるとして却下する傾向があります。

  • パフォーマンスが向上する可能性があります。たとえば、オプティマイザはローカル変数の参照をtab変更できないことを知っているため、配列の境界チェックをより適切に最適化できます。

これらのうち、3番目の理由が最も妥当だと思います。

(モディファイアとは何の関係もないと思いますtransient。この場合、モディファイアは読みやすさのためだけにあります。HashMapクラスが提供readObjectwriteObjecttransientモディファイアを無効にします。)

于 2012-08-27T06:11:40.980 に答える
2

tableフィールドが として宣言されているためtransient、HashMap オブジェクトの永続状態の一部ではない可能性があります。フィールドは、同期されていない のtableようなメソッドで置き換えられるため、メソッド呼び出し内のすべてのエントリを反復処理するときに、フィールドが下から交換される可能性があります。firstへの参照を作成し、その参照を繰り返し処理する場合、フィールドが変更された場合でも元の を繰り返し処理していることが保証されます。resize()tableclear()tabletabletable

于 2012-08-27T06:10:10.260 に答える