2013-04-02 17 views
12
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; 
} 

Co Wiedziałem to, że jeśli chcemy uzyskać obiekt z HashMap przede wszystkim wyszukuje wiadro hash na podstawie hashcode/wartość hash i następnie wykonuje iteracje poprzez LinkedList w tym hashbucket (załóżmy obiekty diff mają ten sam kod skrótu, a więc w tym samym buforze mieszającym).HashMap wykorzystuje LinkedList wewnętrznie

Ale po pobycie w powyższym kodzie, nie jestem w stanie zrozumieć, kiedy to iteracje przez LinekedList (i gdzie jest LinkedList)

Odpowiedz

21

Wiadro jest połączona lista, skutecznie. Macierz table jest tablicą z elementami Entry, a każda z nich jest połączona listą, w której każdy wpis wie o następnym na liście, dopóki nie dojdzie do końca, gdy odwołanie next jest puste. Pętla for, którą pokazałeś, wyświetla się na połączonej liście.

To nie jest LinkedList jak w - jest to oddzielna (prostsza) implementacja tylko dla mapy.

3

Używa ona listy połączonej, ale nie klasy java.util.LinkedList.

Zasadniczo e.next to coś, czego szukasz. Każdy wpis zawiera odniesienie do następnego wpisu w wiadrze - jest to implementacja listy powiązanej.

2

e.next jest tym, czego szukasz. Każdy wpis zawiera odniesienie do następnego wpisu w wiadrze; jest to implementacja listy powiązanej.

Powiązane problemy