equals() und hashCode()

T

tobim1986

Gast
Moin moin,

ich habe mal eine Frage zu den oben genannten Methoden: Wie ich in der Java-Insel gelesen habe, sollten beide Methoden implementiert werden, um Objekte auf Gleichheit zu prüfen.

hashCode() ist ja wichtig um Objekte in einigen Collections wiederzufinden, equals() um die Objekte auf Inhaltsgleichheit zu prüfen.

Als typische Implementierungsbeispiele finde ich für hashCode(), dass die HashCodes der einzelnen Instanzvariablen zusammengerechnet werden.
equals() wird typischerweise implementiert, indem man die einzelnen Instanzvariablen auf Identität prüft.

Warum kann ich equals() nicht folgender maßen implementieren:

Java:
public boolean equals(Typ other){
   return this.hashCode() == other.hashCode();
}

Das wäre doch viel kürzer als alle Instanzvariablen einzeln zu überprüfen, oder?

Danke und Gruß
tobim1986
 
M

maki

Gast
Hashcodes sind nicht eindeutig, d.h. 2 vollkommen unterschiedliche Objekte können denselben hashcode haben.
 
S

SlaterB

Gast
das Lehrbuch könnte da durchaus deutlicher hinweisen, der entsprechende Abschnitt ist
Equals, die Null und das Hashen

Inhaltlich gleiche Objekte (gemäß der Methode equals()) müssen denselben Wert bekommen.

Die beiden Methoden hashCode() und equals() hängen miteinander zusammen, sodass in der Regel bei der Implementierung einer Methode auch eine Implementierung der anderen notwendig wird. Denn es gilt, dass bei Gleichheit natürlich auch die Hash-Werte übereinstimmen müssen. Formal gesehen heißt das:

x.equals( y ) => x.hashCode() == y.hashCode()

So berechnet sich der Hashcode bei Point-Objekten aus den Koordinaten. Zwei Punkt-Objekte, die inhaltlich gleich sind, haben die gleichen Koordinaten und damit auch den gleichen Hashcode. Wenn Objekte den gleichen Hashcode aufweisen, aber nicht gleich sind, handelt es sich um eine Kollision und den Fall, dass in der Gleichung nicht die Äquivalenz gilt.
besonders also der letzte Satz, aber nicht ausführlich genug

Hashcode ist nicht eindeutig, nur ziemlich deutlich,
es gibt 10^100 und mehr Strings, aber nur z.B. 10^9 HashCodes, da ist nicht für jeden String ein eigener HashCode da,
String "hallo" und String "fsdhlhflejklerjerlkj" können denselben HashCode haben, sind aber gewiss deshalb nicht gleich
 
T

tobim1986

Gast
Danke für die schnelle Antwort, aber ich muss noch mal nachhaken:

Nehmen wir mal an, ich packe zwei Objekte, die zufällig den gleichen Hashcode haben in eine HashMap. Dann würde ich eines von beiden ja nie wieder aus der HashMap rausholen können, da HashMap die Objekte anhand des Hashcodes identifiziert, oder?
 
S

SlaterB

Gast
> da HashMap die Objekte anhand des Hashcodes identifiziert, oder?

siehe auch die anderen Posts zwischendurch, und nein, HashMap ist schlauer als du vermutest, verwendet auch equals
 
T

tobim1986

Gast
Okay. Vielen danke für die Hilfe. Ich bin begeistert, wie schnell man hier geholfen bekommt! :toll:

Ich werde in der nächsten Zeit mal öfters hier vorbei schauen...
 

Marco13

Top Contributor
Wenn zwei Objekte den gleichen HashCode haben, werden sie in der HashMap quasi in einer "Liste" gespeichert, nämlich der "Liste aller Objekte mit diesem hashCode". Wenn man dann "contains" o.ä. aufruft, mit einem Objekt das diesen hashCode hat, dann landet man zuerst bei der Liste. Dann wird noch geschaut, ob ein Objekt dieser Liste wirklich equals zum übergebenen Objekt ist.

Theoretisch ist es erlaubt, bei allen Klassen einfach
Code:
public int hashCode() { return 42; }
zu schreiben - aber das ist natürlich extrem schlecht. Die HashCodes verschiedener Objekte sollten möglichst "breit gestreut" sein. (Das alleine reicht auch nicht, aber Hashing ist im Detail nochmal eine Wissenschaft für sich...)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals Java Basics - Anfänger-Themen 3
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
K equals() und hashcode() überschreiben Java Basics - Anfänger-Themen 5
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
B Frage zu equals() und hashCode() Java Basics - Anfänger-Themen 28
A veränderbar kanonische Klassen: Methode equals, hashcode, serializable Java Basics - Anfänger-Themen 5
S equals() - hashCode() - Contract Java Basics - Anfänger-Themen 54
R Vergleiche mit Equals(), hashCode() und == Java Basics - Anfänger-Themen 10
Say Equals Java Basics - Anfänger-Themen 6
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
J compareTo()- und equals-Methode Java Basics - Anfänger-Themen 3
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
lallmichnichtzu Methoden Überladen des .equals-Operators Java Basics - Anfänger-Themen 6
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
G Java equals() Methode Java Basics - Anfänger-Themen 9
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
D Unterschied == und equals in Arrays Java Basics - Anfänger-Themen 2
O equals Methode möglichst effizient Java Basics - Anfänger-Themen 13
H equals methode Java Basics - Anfänger-Themen 1
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
E equals Prüfung fehlgeschlagen Java Basics - Anfänger-Themen 3
C Objekt equals Java Basics - Anfänger-Themen 2
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
H equals Methode Java Basics - Anfänger-Themen 1
F String equals NULL Problem Java Basics - Anfänger-Themen 4
D Auf equals von Vaterklasse zugreifen Java Basics - Anfänger-Themen 4
S Methoden equals(object o) / toString Java Basics - Anfänger-Themen 15
E Calender - Equals Problem Java Basics - Anfänger-Themen 14
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
S compareTo() und equals() Java Basics - Anfänger-Themen 6
S equals Methode bei String Java Basics - Anfänger-Themen 5
R illegal start of expression - 3 Strings vergleichen mit .equals () Java Basics - Anfänger-Themen 5
K Cast bei equals Java Basics - Anfänger-Themen 2
T SQL equals Java Basics - Anfänger-Themen 4
OnDemand Methoden Equals Methde Java Basics - Anfänger-Themen 3
D if block mit equals im rumpf Java Basics - Anfänger-Themen 11
K Vererbung equals-Methode bei Vererbung abstrakter Klassen Java Basics - Anfänger-Themen 8
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
K String - Equals Java Basics - Anfänger-Themen 2
J Klassen Warum ist (a.equals(b)) gleich (a==b)? Java Basics - Anfänger-Themen 13
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
S Verständnissfrage equals() Java Basics - Anfänger-Themen 2
R compareTo & equals Java Basics - Anfänger-Themen 10
M Verschiedene Möglichkeiten mit 'equals' abdecken? Java Basics - Anfänger-Themen 9
W Stringvergleich mit equals Java Basics - Anfänger-Themen 13
C equals() Java Basics - Anfänger-Themen 4
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
T Problem mit der while(!string.equals("x")) Java Basics - Anfänger-Themen 2
E Equals-Methode auf Class-Object Java Basics - Anfänger-Themen 17
X problem mit equals.gelöst Java Basics - Anfänger-Themen 2
J Methode equals() Java Basics - Anfänger-Themen 7
M Equals überschreiben Java Basics - Anfänger-Themen 3
K equals in Hashmap() Java Basics - Anfänger-Themen 4
B if equals(irgendeine Zahl+Buchstabe) Java Basics - Anfänger-Themen 6
D probs mit clone und equals Java Basics - Anfänger-Themen 10
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
N Vergleich per equals Java Basics - Anfänger-Themen 5
S comparable und equals Java Basics - Anfänger-Themen 7
M Frage zu Textvergleich (equals) Java Basics - Anfänger-Themen 8
G Strings vergleichen mit equals, geht das kürzer? Java Basics - Anfänger-Themen 4
B Frage zu Funktion mit equals Java Basics - Anfänger-Themen 17
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
D "2010–03–12".equals( "2010-03-12" ) Java Basics - Anfänger-Themen 6
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
T Problem mit equals Java Basics - Anfänger-Themen 5
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
S equals vergleich Java Basics - Anfänger-Themen 10
H Equals hascode Java Basics - Anfänger-Themen 5
S Equals Downcast? Java Basics - Anfänger-Themen 11
D equals Vergleiche Java Basics - Anfänger-Themen 7
L String mit equals vergleichen Java Basics - Anfänger-Themen 6
F String equals null wird nicht angenommen. Java Basics - Anfänger-Themen 24
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
P Toleranz bei equals Java Basics - Anfänger-Themen 4
D String#equals + String#charAt Java Basics - Anfänger-Themen 5
G mehrere Werte für .equals ? Java Basics - Anfänger-Themen 22
T [SOLVED] Java String equals funktioniert nicht Java Basics - Anfänger-Themen 5
C 2 Objekte (mathematisch) vergleichen in der equals Methode Java Basics - Anfänger-Themen 10
B String.equals(Object) anstatt "=" Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben