Wie hashcodes für enums entsprechen in Java, und die Kombination von enum-hashCodes für eine HashMap key
Habe ich eine Klasse, die enthält verschiedene Enumerationen, die (verschiedenen Arten). Diese Klasse dient als Schlüssel für eine HashMap
. Die Klassen hashCode derzeit umgesetzt wird, wie diese:
public static class Key implements Comparable<Key> {
final int a;
final Enum1 enum1;
final Enum2 enum2;
@Override
public int hashCode() {
return a ^ enum1.hashCode() ^ enum2.hashCode();
}
//... definition of equals and toString ...
}
Nun, wenn enums hashCode würde nur wieder den index des enum-Wert in der enum-definition, wäre dies nicht optimal sein (zu viele Auseinandersetzungen). Die Methode definition für Enum.hashCode()
ist diese:
/**
* Returns a hash code for this enum constant.
*
* @return a hash code for this enum constant.
*/
public final int hashCode() {
return super.hashCode();
}
Vorausgesetzt, diese Delegierten zu Object.hashCode()
, sollte alles in Ordnung sein, weil für jede enum-Konstante es existiert nur eine Instanz, und Object.hashCode()
wird in der Theorie so etwas wie eine integer abgeleitet von der internen Adresse des Objekts. Bin ich im Recht?
PS: natürlich wird es etwas komplexer, wenn die gleichen enum verwendet wird mehrmals in einem Schlüssel.
Sind Sie rechts? Ich bin sicher, Sie können leicht selbst überprüfen, indem Sie anrufen
myEnum.ordinal()
und myEnum.hashCode()
und Vergleich der Ergebnisse.InformationsquelleAutor Axel | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie haben Recht, dass der hashcode eines enum-element wird aus der statischen Instanz gebunden, memory-Positionen, und einzigartig zu sein.
Auf der anderen Seite, es gibt bessere Wege, um eine hashcode mit weniger auftreffwahrscheinlichkeit. Schauen Sie sich beispielsweise die Standardwerte, die das eclipse kann autogenerate für Sie (mit der rechten Maustaste, Quelle> Generate hashCode und equals)
Durch das werfen von Primzahlen in den mix (der genaue mathematische entgeht mir) Sie sollen ein wenig mehr resistent sind.
Hinweis: Sie können auch lassen Sie eclipse erzeugen eine equals-Methode für Sie! (Auch eine toString). Nicht sagen, man muss blind Vertrauen, aber Sie sind in der Regel sehr guten start.
sorry, ich habe nicht bekommen, was Sie bedeuten. Könnten Sie erklären, ein wenig weiter?
InformationsquelleAutor
Wie oben gesagt,Enum sind unveränderlich in Java,
Also den hashcode, erzeugt ein Enum ist eine perfekte Schlüssel für einen Hash-Sammlung,genau wie der String perfekt keys.
Die enum-Deklaration ist eine spezielle Art von Klasse Erklärung. Ein enum-Typ hat in der öffentlichkeit, selbst-typisierte Mitglieder für jede der genannten enum-Konstanten. Alle enum-Klassen haben eine hohe Qualität toString, hashCode und equals-Methoden. Alle Serialisierbar sind, Vergleichbar und effektiv final. Keine klonbar. Alle von der "Objekt-Methoden außer toString endgültig: wir kümmern uns um den Vergleich und die Serialisierung und garantieren t
hat es richtig gemacht.
InformationsquelleAutor
In Java 8 verwenden, können Sie
Objects.hash()
für diesen Zweck.Zum Beispiel, können Sie schreiben Sie Ihre
hashCode
zuArrays.hashCode(a, enum1, enum2);
InformationsquelleAutor
Gerade getestet, die auf eine Oracle-JVM 1.6. Die enum in der Tat der Delegierten zum Objekt.hashCode(). Und es variiert zwischen den verschiedenen Läufen. Beachten Sie aber, dass die Tasten so nicht stabil zwischen verschiedenen VMs /VM-Instanzen. Also, wenn Sie serialisieren der HashMap und Lesen Sie es wieder in einer anderen VM, die Sie nicht in der Lage, look-up-Werte mit den Tasten, die konstruiert worden ist, dass die VM.
HashMap
davon ausgegangen, dass der Schlüssel der hash-Werte kann sich ändern, von serialisieren zu deserialisation.Dein Punkt über die Karte nicht zu Deserialisieren korrekt aber nicht wirklich stimmt:
HashMap
customises eigene Serialisierung, und seine serialisierte form umfasst die Einträge, geschrieben als eine Liste, so dass die eigentliche hashtable wird rekonstruiert, mit dem lokal entsprechenden hashcodes, wenn er deserialisiert wird.Thx für das update!
InformationsquelleAutor