2016-12-13 8 views
2
// this is the hashCode method of Set 
public int hashCode() { 
    int h = 0; 
    Iterator<E> i = iterator(); 
    while (i.hasNext()) { 
     E obj = i.next(); 
     if (obj != null) 
      h += obj.hashCode(); 
    } 
    return h; 
} 



//this is the hashCode method of List 
public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 

Warum Java diese zwei verschiedenen Ansätze verwenden? Gibt es irgendetwas, das mit der Eigenschaft von Set und List zusammenhängt? Warum verwendet es 31, aber keine anderen Nummern? Danke!Warum Java verschiedene Hashcode-Methoden von Set und ArrayList implementieren?

+1

Ich habe den Teil über List vs Set beantwortet, weil ich dazu keine weiteren Fragen zu SO finden konnte. Aber das Bit über 31 ist bereits beantwortet: siehe http://stackoverflow.com/questions/299304, sowie andere Antworten, wenn Sie suchen, warum Hash-Funktionen Primzahlen verwenden. – yshavit

Antwort

4

Sätze sind ungeordnet, daher muss {a, b, c} denselben Hash-Code wie {c, b, a} haben. Die Addition ist kommutativ. Wenn Sie also die HashCodes der Elemente hinzufügen, erhalten Sie diese Eigenschaft.

Listen werden bestellt, so während [a, b, c]kann den gleichen Hash-Code wie [c, b, a] haben, es braucht nicht - und es wäre besser, wenn es da so viel wie möglich nicht-gleich-Objekte nicht, tat sollte versuchen, ungleiche hashCodes zu haben. Die ArrayList.hashCode-Implementierung verfügt über diese Eigenschaft.

Beachten Sie, dass Set und Liste sowohl definieren, wie Implementierungen definieren müssen equals und hashCode (Set.hashCode, List.hashCode), so dass jeder (konform) Umsetzung dieser jeweiligen Sammlungen ziemlich gleich aussehen wird. Dies gibt Ihnen die nützliche Eigenschaft, dass ein Set, das die gleichen Elemente enthält, gleich ist (und somit denselben hashCode hat) wie jedes andere Set, unabhängig von den zugrunde liegenden Implementierungen.

+0

Ihre Antwort ist sehr klar. Vielen Dank! –

Verwandte Themen