1

Java では、与えられたlikeを持ってHashMap<Integer, int[]> mapいて検索したい場合、アルゴリズムは を計算し、対応するバケットに移動してタイプのオブジェクトを直線的に検索し、 ?を使用してそれらを比較します。したがって、バケット内のこれらのオブジェクトは同じキー ( によって計算されます) を持ち、 によって比較されます。そうですか?int keymap.get(key)key.hashCode()int[]equals()int[]hashCodeequals()

明確に示されている例をWeb上で見つけることができません。言葉だけ。

あなたが私をリダイレクトしているのは、通常のわかりやすい例が含まれていないため、理論は必要ありません。

4

3 に答える 3

2

修正: ...対応するバケットに移動し、指定されたキーと等しいキー (整数) を持つエントリを直線的に検索します。そして、これがこの検索が実際に HashMap に実装された方法です

final Entry<K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key);
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}
于 2013-03-15T16:10:16.567 に答える
0

データ構造を個別に明確に使用できる場合、これは値として配列を混合するための良い解決策ではないと思います。ハッシュマップの考え方は、テーブルを基準にしてインデックスを凝縮することです。すべてのintを個別のデータ構造に簡単に保持し、forループで列挙し、キーをputとペアにすることができます。この基礎となる構造は、参照が格納されている場所に関係なく、参照を提供します。

于 2013-03-15T16:12:08.170 に答える
0

2 ^ 32の可能なハッシュコードがありますが、バケットの最大数はInteger.MAX_VALUE、可能な最大のintです。つまり、HashMapは複数のハッシュコードを同じバケットにマップする必要があります。

プローブキー(この場合は整数)を検索するには、最初にプローブのハッシュコードを計算します。そのハッシュコードを含むバケットに移動します。バケット内の(key、value)ペアのキーをスキャンして、ハッシュコードがプローブハッシュコードと一致するキーを探します。必要なハッシュコードを持っているキーに対してのみequalsテストを実行します。

キーがプローブと等しい(キー、値)ペアが見つかった場合は、値(この場合はint []参照)を返します。

nullの処理の詳細については、@Evgeniyの回答で引用されているコードを参照してください。

于 2013-03-15T16:27:34.093 に答える