1

ここで Java HashMap の実装を調べます: http://www.docjar.com/html/api/java/util/HashMap.java.html私は次のことに気付きました:

使用される内部データ構造は、各インデックスでリンクされたリストの最初のエントリへの参照を格納する配列です。配列インデックスはキーのハッシュコードに基づいており、リンクされたリストはその特定のハッシュコードのバケットを表します。私が興味深いと思ったのは、メソッド indexFor(int h, int length) です。このメソッドは、特定のキーに対して、配列内のどのバケットを調べるかを決定します。しかし、return h & (length - 1) という実装は、次の意味で奇妙に見えます特定の配列インデックスと一致しない不確定な数のハッシュコードの場合、メソッドは 0 を返します。したがって、オブジェクトに実装する一意のハッシュコードに関係なく、配列内の 0 バケットはオブジェクトでいっぱいになる可能性が高いため、一意のハッシュコードが提供するはずのもの、つまりより高速なデータアクセスの恩恵を受けません。

何か不足していますか?

クリスチャン

4

2 に答える 2

4

HashMap ソース コードから次の Javadoc が欠落しています。

/**
 * The table, resized as necessary. Length MUST Always be a power of two.
 */
transient Entry<K,V>[] table;

これは、table.length-1常に 1 のシーケンスになることを意味します。

于 2012-10-05T14:30:04.290 に答える
0

あなたが何を問題だと信じているのか、私にはよく理解できません。

は、どこが 2 の累乗であるかh & (length - 1)を計算する簡単な方法です。私の理解では、不自然に多数のゼロを与える理由はありません。h % nnh % n

于 2012-10-05T14:29:55.490 に答える