Wann und warum hashcode und equals?

Wuast

Bekanntes Mitglied
Hallo Experten,
kann mir jemand erklären, wofür (und wann) ich die hashcode-Methode brauche und warum dies immer mit der equals zusammen aufgerufen werden muss?
Komme da irgendwie nicht weiter.

Danke vorab und schöne Ostertage :)
 

KonradN

Super-Moderator
Mitarbeiter
Die Hashcode Methode brauchst Du, wenn Du mit den Instanzen etwas machst, in dem der hashcode verwendet wird. Typische Beispiele sind HashMap und HashSet.

Eine ganz einfache, grobe Erklärung:
Du kannst komplexe Klasse haben. Um da zwei Instanzen zu vergleichen musst Du dann sehr aufwändig vieles Vergleichen. Das kostet relativ viel Zeit.
Des Weiteren hast Du oft die Anforderung, dass Du etwas sozusagen in Fächer vorsortieren willst um dann schneller etwas zu finden. Da bräuchte man auch irgend einen Weg, etwas in n Fächer aufzuteilen. Hier kann es dann gut sein, wenn man zu jedem Element eine Zahl zuordnen kann. Wenn Du also n Fächer haben willst, dann kannst Du die Zahl Modulo n rechnen und hast dann eine Fachnummer von 0 ... (n-1).

Damit diese "üblichen" Algorithmen funktionieren, müssen gewisse Regeln eingehalten werden:

- Wenn zwei Instanzen gleich sein (also equals liefert true), dann muss der hashcode gleich sein.
- Wenn Du etwa als Key verwendest, dann darf sich der HashCode nicht mehr ändern.

Auf Grund der ersten Regel ist es so, dass man immer equals und hashcode überschreibt sobald man eines von beidem braucht.
 

Robert Zenz

Top Contributor
kann mir jemand erklären, wofür (und wann) ich die hashcode-Methode brauche

Immer dann wenn du einen eindeutigen Wert fuer diesen *Zustand* willst. Also nehmen wir mal folgende Klasse an:

Java:
public class Name {
    private String value;
    
    public Name(String value) {
        this.value = value;
    }
    
    public String getValue() {
        return value;
    }
}

Wir haben einen einfachen Container fuer Namen. Namen sind identisch wenn diese identisch sind, also "Hansi" soll ident sein zu "Hansi". Das ist standardmaeszig natuerlich nicht der Fall, da diese unterschiedliche Instanzen sind:

Java:
Name nameA = new Name("Hansi");
Name nameB = new Name("Hansi");

nameA == nameB; // false
nameA.equals(nameB); // false

Wenn wir jetzt wissen wollen ob diese Namen identisch sind, muessten wir die Werte vergleichen:

Java:
if (nameA.getValue().equals(nameB.getValue())) {
    // ...
}

Nachdem sich das relativ hart tippt (und wenn wir 12 Felder haben auch etwas umstaendlich wird), implementiert man fuer gewoehnlch equals]:

Java:
public class Name {
    private String value;
    
    public Name(String value) {
        this.value = value;
    }
    
    public String getValue() {
        return value;
    }
    
    @Override
    public boolean equals(Object other) {
        // TODO Check "other" type.
        return value.equals(other.value);
    }
}

Also damit definiere ich, dass unterschiedliche Instanzen mit den gleichen Werten als ident anzusehen sind. Ab hier greift nun das was @KonradN gesagt hat, naemlich das man einen Weg braucht um schnell eine, relativ, eindeutige Identifikation eines Zustands braucht. Das ist dann hashCode:

Java:
public class Name {
    private String value;
    
    public Name(String value) {
        this.value = value;
    }
    
    public String getValue() {
        return value;
    }
    
    @Override
    public boolean equals(Object other) {
        // TODO Check "other" type.
        return value.equals(other.value);
    }
    
    @Override
    public void int hashCode() {
        return value.hashCode();
    }
}

Wenn du da naeheres dazu wissen willst, schlage ich die Javadoc von equals und hashCode direkt vor, oder das Kapitel dazu in "Effective Java", wenn du Buecher magst.
 

Neumi5694

Top Contributor
Hashcode wird nur sehr selten verwendet, HashMap macht damit eine grobe Einteilung, in welchem Container-Bereich ein Wert untergebracht werden soll.
Aber um sicherzugehen, ob es sich bei einem vorhandenen Eintrag bei gleichem Hashcode tatsächlich um einen äquivalenten Eintrag handelt, wird immer noch equals aufgerufen.
 

Wuast

Bekanntes Mitglied
Ah okay, ich denke jetzt bin ich einen Schritt weiter. Mal schauen, ob und wann ich es erstmals anwenden muss. Vllt. nerve ich dann hier nochmal rum.

Noch eine ergänzende Frage: Die equals-Methode (wie auch hashcode) funktioniert in verschiedenen Schritten, die ich aber bei eclipse nicht selber schreiben muss weil mir eclipse das abnimmt!? Ich meine mich zu erinnern, dass ich mal mit .equals(...) gearbeitet habe, aber da habe ich nicht direkt die ganze Methode aufgerufen (soweit mir bewusst)

Ich danke für die Rückmeldungen!
 

temi

Top Contributor

Neumi5694

Top Contributor
Eclipse erstelle keine Equals Methode, es existiert eine vorhandene, welche sämtliche Klassenvariablen berücksichtigt. Gleiches gilt für die Hashcode-Methode. Die machen im Normalfall ihren Job ganz gut und du wirst sie nur selten überschreiben müssen.
Das wird erst der Fall, wenn du in den Klassen z.B. Listen verwendest. Beide Objekte haben ihre jeweils eigene Liste, deren Inhalte sollen allerdings gleich sein. In so einem Fall kann's passieren, dass du selbst Hand anlegen musst. Das brauchst du grundsätzlich dann, wenn 2 verschiedene Werte als gleich erkannt werden sollen.

Ich lass equals im Normalfall in Ruhe, hab für meine Datenklassen eine Interface geschrieben, das mit einem Objekt gleicher Klasse vergleicht, das ist sinnvoll, um z.B. eine Arbeitskopie mit dem Originalobjekt zu vergleichen, um Änderungen zu erkennen. Dort wird dann im Debug-Modus noch gleich eine Information mit geloggt, bei welcher Eigenschaft es Unterschiede gab, ähnlich den Vergleichen in der JUnit-Assertklasse, aber ohne Exceptions. Mein wichtigstes Prokjekt hat eine fast schon vierstellige Anzahl benannter Klassen, ich musste Equals nur ein einziges Mal verändern.
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Eclipse erstelle keine Equals Methode, es existiert eine vorhandene, welche sämtliche Klassenvariablen berücksichtigt. Gleiches gilt für die Hashcode-Methode.
Das stimmt nicht, die Default equals Methode ist (quasi) äquivalent zu dem == Operator und hashCode ist ein fester Wert, der bei der Objekterzeugung mehr oder minder zufällig erzeugt wird. Klassen-Variablen werden dabei nicht berücksichtigt!

Man kann mit Eclipse eine equals & hashCode Methode generieren lassen, die die zu diesem Zeitpunkt vorhanden Member (bzw. die man will) berücksichtigt und darüber eine Gleichheit festgestellt werden soll

Genau so sieht die Standard-Equals Methode aus:
Java:
    public boolean equals(Object obj) {
        return (this == obj);
    }
 
Y

yfons123

Gast
ist ein fester Wert, der bei der Objekterzeugung mehr oder minder zufällig erzeugt wird.
EINSPRUCH EUER EHREN
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
bei string wurde die methode überschrieben und berechnet den wert anch der formel
 

LimDul

Top Contributor
EINSPRUCH EUER EHREN

bei string wurde die methode überschrieben und berechnet den wert anch der formel
Das ist für die Klasse String der Fall, wo es explizit programmiert wurde, aber nicht allgemeingültig. Das ist nicht die Standard-HashCode Implementierung von Object, sonder explizit für String.
 

Neumi5694

Top Contributor
Das stimmt nicht, die Default equals Methode ist (quasi) äquivalent zu dem == Operator und hashCode ist ein fester Wert, der bei der Objekterzeugung mehr oder minder zufällig erzeugt wird. Klassen-Variablen werden dabei nicht berücksichtigt!

[/code]
Hmm, ok. Da hab ich wohl etwas zu weit gegriffen / was durcheinandergebracht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I Logik Zahlungsprozess - Wann Bestellobjekt anlegen? Java Basics - Anfänger-Themen 2
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
W Wann Rückgabewerte 0, 1, -1? Java Basics - Anfänger-Themen 27
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Wann Methode abstract? Java Basics - Anfänger-Themen 10
S Wann buffer löschen? Java Basics - Anfänger-Themen 5
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
K Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt? Java Basics - Anfänger-Themen 7
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
O Wann nutzt man static? Java Basics - Anfänger-Themen 19
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
D Wann genau nutze ich ein solches Interface? Java Basics - Anfänger-Themen 3
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
C Variablen Wann werden Instanzvariablen initalisiert? Java Basics - Anfänger-Themen 10
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
T Ab wann ist es ein großes Projekt? Java Basics - Anfänger-Themen 35
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
W Wann nutze ich "import"? Java Basics - Anfänger-Themen 12
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
H Wann ein Objekt der Programmklasse in main anlegen Java Basics - Anfänger-Themen 2
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
T Wann for und wann while?? Java Basics - Anfänger-Themen 35
-horn- Wann wird alles NaN erzeugt? Java Basics - Anfänger-Themen 22
S Wann wird eine Klasse geladen? Java Basics - Anfänger-Themen 17
C this - wann verwende ich das? Java Basics - Anfänger-Themen 10
T Threads - Ab wann wirds Kritisch?! Java Basics - Anfänger-Themen 7
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
G field public/private wann Java Basics - Anfänger-Themen 11
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
GambaJo Wann try.catch nutzen? Java Basics - Anfänger-Themen 11
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
S wann static Funktionen wann nicht Java Basics - Anfänger-Themen 6
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
Bernasconi Programmierstil / Wann eine neue Datei? Java Basics - Anfänger-Themen 5
M wann, welche schleife Java Basics - Anfänger-Themen 3
M Ab wann ist die Datei sichtbar? Java Basics - Anfänger-Themen 3
G Herausfinden, wann mehrere Threads abgeschlossen sind Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
N SAX, StAX, JDOM oder DOM , ab wann welches für XML Java Basics - Anfänger-Themen 14
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
I Festellen wann Methode in anderer Klasse fertig ist Java Basics - Anfänger-Themen 5
M wann statische klassen? Java Basics - Anfänger-Themen 14
M Wann ist initialisieren sinnvoll? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
R Wann benutzt man << oder >> ? Java Basics - Anfänger-Themen 2
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
S Hashcode-Berechnung + ^ Java Basics - Anfänger-Themen 2
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
G HashCode für Indexberechnung im Array Java Basics - Anfänger-Themen 2
E hashCode implementierung Java Basics - Anfänger-Themen 9
M hashcode Java Basics - Anfänger-Themen 3
T hashCode-Kontrakt Java Basics - Anfänger-Themen 1
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals Java Basics - Anfänger-Themen 3
T hashCode mit boolean Java Basics - Anfänger-Themen 1
M Frage zu HashCode Methode in Java Java Basics - Anfänger-Themen 7
M Hashcode als lesbarer String Java Basics - Anfänger-Themen 1
S Hashcode - Operator ^ Java Basics - Anfänger-Themen 11
G 64 Bit Hashcode erstellen aus String Java Basics - Anfänger-Themen 11
K hashCode() Java Basics - Anfänger-Themen 2
C hashCode() bei Klassen, die nicht immutable sind Java Basics - Anfänger-Themen 27
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
H Hashcode aus Datei erzeugen Java Basics - Anfänger-Themen 7
B Hashcode Java Basics - Anfänger-Themen 25
K equals() und hashcode() überschreiben Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben