15
public V get(Object key) {
if (key == null)
    return getForNullKey();
    int hash = hash(key.hashCode());
    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.equals(k)))
            return e.value;
    }
    return null;
}

私が知っていたのは、からオブジェクトを取得したい場合HashMap、まずハッシュコード/ハッシュ値に基づいてハッシュバケットを検索し、次にそのハッシュバケットを反復処理するLinkedListことです(差分オブジェクトが同じハッシュコードを持っていると仮定すると、同じハッシュ バケット)。

しかし、上記のコードを見た後、LinekedList を反復するタイミング (および LinkedList の場所) を理解できません。

4

4 に答える 4

22

バケット事実上、リンクされたリストです。table配列はEntry要素の配列であり、それぞれがリンクされたリストであり、参照が nullEntryのときに最後に到達するまで、各エントリはリスト内の次のエントリを認識します。あなたが示しnextたループは、リンクされたリストを繰り返します。for

これはLinkedList同じではありませんjava.util.LinkedList- マップのためだけに別の (より単純な) 実装です。

于 2013-04-02T16:02:07.297 に答える
3

e.nextあなたが探しているものです。各エントリには、バケット内の次のエントリへの参照があります。これは、リンクされたリストの実装です。

于 2013-08-24T19:26:12.503 に答える