2016-07-07 12 views
5

Mein Freund fragte mich heute nach einer Interviewfrage.Kann in hashmap ein erneutes Hashing vermieden werden?

Gibt es eine Möglichkeit, Hashmap zu verhindern/zu vermeiden? Der Interviewer gab einen Hinweis, dass es einen Haken, mit dem Wiederkäuen

vermieden werden kann

Ich habe versucht, in die HashMap Code suchen und sieht aus wie sobald es den Lastfaktor trifft es

Einstellen der Ladefaktor auf ein Aufgüsse höherer Wert kann das Wiederkäuen Prozess nur verzögern

am verwirrt, wenn an allen möglichen

Wiederkäuen zu verhindern

wenn jemand mich in die richtige Richtung zeigen kann, kann es helfen,

+0

Die Anfangskapazität größer als die maximale Anzahl der zu speichernden Elemente dividiert durch den Auslastungsfaktor machen? – immibis

+0

Ja, indem Sie den Lastfaktor einstellen. Und ja, man kann es nur komplett vermeiden, wenn man weiß, wie viele Elemente hinzugefügt werden. –

+6

Seufz ... ein anderer Interviewer, der testen will, ob Interessenten die Quelle der Java-Laufzeit auswendig gelernt haben ... Ich sehe einfach nicht, was es bedeutet, Fragen wie diese zu stellen. – ajb

Antwort

5

Ja, es av sein kann oided, wenn Sie die Größe Ihrer hashmap vorher kennen.

Set loadFactor = 1 (Standardwert ist 0,75)

initialCapacity = size of hashmap + 1 (Standardwert ist 16).

den folgenden Konstruktor Verwenden Sie Ihre hashmap

public HashMap(int initialCapacity, float loadFactor) 

Dies funktioniert, weil in dem folgenden Code-Schnipsel aus der HashMap Klasse zu instanziiert, die Bedingung (size >= threshold) wird nie zufrieden sein, so dass die Hash-Tabelle wird nie die Größe verändert.

void addEntry(int paramInt1, K paramK, V paramV, int paramInt2) 
{ 
    if ((size >= threshold) && (null != table[paramInt2])) 
    { 
     resize(2 * table.length); 
     paramInt1 = null != paramK ? hash(paramK) : 0; 
     paramInt2 = indexFor(paramInt1, table.length); 
    } 
    createEntry(paramInt1, paramK, paramV, paramInt2); 
}