5

特に 393 行目のコードを見ると、異なるハッシュが同じインデックスにマッピングされているように見えます。HashMap のどのバケットを使用するかを決定するためにハッシュコードが使用され、バケットは同じハッシュコードを持つすべてのエントリのリンクされたリストで構成されていることを理解していました。彼らはなぜe.hash == hash小切手を持っているのですか?



    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

4

3 に答える 3

2

ハッシュコードは 2^32 の値の 1 つである可能性があるため、ハッシュマップに非常に多くのバケットが含まれることはまれです (テーブルだけで 16 GB のメモリが必要になります)。そうです、マップの同じバケットに異なるハッシュを持つオブジェクトを持つことができます (私の知る限り、それは の単純なモジュラス操作ですhachCode % numberOfBuckets)。

コードは直接使用しないことに注意してkey.hashCode()くださいhash(key.hashCode())

于 2013-10-13T19:45:41.360 に答える
1

このチェックは、衝突を考慮した最適化です。
(衝突により) 同じハッシュ キーを持つ 2 つの要素を持つことができ、その結果、同じバケットにマップされます。同じキーの異なる実際の要素。
したがってe.hash != hash、等価性をチェックする必要がない場合 (これはコストのかかる操作になる可能性があります)

于 2013-10-13T20:13:00.443 に答える