Der Hash-Code eines Objekts
How To ...
Wie implementiert man die Methode hashCode() korrekt?
Hintergründe
Die Methode hashCode() wird z.B. dazu verwendet, um mit Hilfe von Hash-Tabellen assoziative Arrays zu simulieren. Die Implementierung von hashCode() in java.lang.Object ist native. Sie ist in der Standardimplementierung als Abbildung der Speicheradresse des Objekts auf einen int-Wert realisiert. In ihren eigenen Klassen können Sie hashCode() überschreiben, müssen aber darauf achten, dass Sie dies nach bestimmten Vorgaben tun.
So geht's
Beim Überschreiben der Methode hashCode() müssen Sie darauf achten, dass Ihre Implementierung
- bei wiederholtem Aufruf in einem VM-Lauf denselben int-Wert zurückliefert, falls keine Daten, die zur Berechnung der equals()-Methode (siehe How-To Gleichheit von Objekten) verwendet werden, verändert wurden. Bei einem erneuten VM-Lauf darf ein verschiedener Wert zurückgegeben werden.
- bei zwei gleichen Objekten (basierend auf equals()) denselben Hash-Wert zurückgibt.
Die Implementierung muss nicht für verschiedene Objekte (basierend auf equals()) verschiedene Hash-Werte zurückliefern. Für die Performanz von Hash-Tabellen ist dieses Verhalten jedoch sehr positiv.
Auch hier ist das Studium eines Beispiels lehrreich. Die Implementierung von hashCode()
der Klasse String berechnet den Hash-Wert als
s[0]*31(n-1) + s[1]*31(n-2) + ... + s[n-1]
wobei s[i] das i-te Element des Strings und n seine Länge ist:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
