Der Hashwert eines Objekts bildet den Zustand auf eine kompakte Ganzzahl ab. Haben zwei Objekte ungleiche Hashwerte, so müssen auch die Objekte ungleich sein (mindest, wenn die Berechnung korrekt ist). Zur Bestimmung des Hashwertes deklariert jede Klasse über die Oberklasse java.lang.Object die Methode int hashCode(). Alle Wrapper-Klassen überschreiben diese Methode. Zudem kommen in Java 8 statische Methoden hinzu, sodass sich leicht der Hashwert berechnen lässt, ohne extra ein Wrapper-Objekte zu bilden.
Klasse |
Klassenmethode |
Objektmethode |
Boolean |
static int hashCode(boolean value) |
int hashCode() |
Byte |
static int hashCode(byte value) |
int hashCode() |
Short |
static int hashCode(short value) |
int hashCode() |
Integer |
static int hashCode(int value) |
int hashCode() |
Long |
static int hashCode(long value) |
int hashCode() |
Float |
static int hashCode(float value) |
int hashCode() |
Double |
static int hashCode(double value) |
int hashCode() |
Character |
static int hashCode(char value) |
int hashCode() |
Abbildung 4 Statische Mehtoden hashCode(…) und Objektmethoden im Vergleich
Um den Hashwert eines ganzen Objekts zu errechnen, müssen folglich alle einzelnen Hashwerte berechnet werden und diese dann zu einer Ganzzahl verknüpft werden. Schematisch sieht das so aus:
int h1 = WrapperClass.hashCode( value1 );
int h2 = WrapperClass.hashCode( value2 );
int h3 = WrapperClass.hashCode( value3 );
…
Eclipse nutzt zur Verknüpfung der Hashwerte folgendes Muster, welches eine guter Ausgangspunkt ist:
int result = h1;
result = 31 * result + h2;
result = 31 * result + h3;
…