Vergleiche mit Equals(), hashCode() und ==

Status
Nicht offen für weitere Antworten.

rene_kochan

Mitglied
Hallo Leute!
Ich bin etwas verwirrt, was die Vergleiche mit equals, hashCode() und == anbelangt. Es geht mir hierbei, um das theoretische Verständnis. Angenommen werden soll, dass Equals und HashCode() selbstverständlich überschrieben werden, damit der Vergleich auch richtig funktioniert. Ich will hier nur mal wissen, ob meine Überlegungen richtig sind oder was ihr zu den einzelnen Fällen zu sagen habt.
Hier mal meine Überlegungen dazu:
1. wenn Vergleich mit == true ergibt, kann Vergleich mit HashCode() true oder false ergeben
2. wenn Vergleich mit == false ergibt, kann Vergleich mit HashCode() true opder false ergeben
3. wenn Vergleich mit HashCode() true ergibt, kann Vergleich mit Equals() true oder false sein
4. wenn Vergleich mit HashCode() false ergibt, kann Vergleich mit == true oder false sein

Ich hoffe, ihr könnt mir da ein wenig helfen und mir sagen, ob meine 4 Überlegungen der Wahrheit entsprechen oder ob ich da einen Fehler habe.

Danke im Voraus für Eure Antworten!!!
 
M

maki

Gast
1. Nein, dasselbe Objekt hat immer denselben Hashcode, der darf sich auch nicht nachträglich ändern, sehr wichtig bei HashSet und HashMap, Hash...
2. Ja, Hashcode muss nicht eindeutig sein, wäre aber besser (effizenter)
3. Ja, wie gesagt, Hashcode ist nicht eindeutig
4. Nein, siehe Punkt 1

Ich vermisse equals in deiner Aufzählung, denn hashcode und equals gehören zusammen!
 
S

SlaterB

Gast
falls man hashCode() so baut, dass es eine Zufallszahl zurückgibt oder equals() zufällig zu true oder false ausgewertet wird,
so sind alle deine Aussagen richtig,

ansonsten musst du das näher begründen,
warum sollte z.B. bei == true, also bei ein und demselben Objekt der hashCode-Vergleich false ergeben können?
 

rene_kochan

Mitglied
Hallo!
Danke erstmal für die Antwort. Ich habe bei den Überlegungen natürlich nur die aufgezählt, bei denen ich mir noch nicht hundertprozentig sicher war. Der Grund für die Beschäftigung mit dieser Materie ist die SCJP - Prüfung, die ich noch ablegen will. Da kommen dann auch solche Fragen, wo man dann halt wissen muss, wenn == true ergibt, wie es dann bei Hashcode() und Equals() aussieht. Objekte vergleiche ich nur mit Equals und Hashcode und überschreibe diese Methoden freilich entsprechend.
Deshalb nochmals vielen Dank für die Antwort. Jetzt sehe ich da noch besser durch.
Tschau!
 

Murray

Top Contributor
maki hat gesagt.:
1. Nein, dasselbe Objekt hat immer denselben Hashcode, der darf sich auch nicht nachträglich ändern, sehr wichtig bei HashSet und HashMap, Hash...
Das stimmt so nicht ganz - der Hashcode darf (und sollte) sich ändern, wenn sich irgendwelche Attribute ändern, die in der equals-Methode berücksichtigt werden.
 

0x7F800000

Top Contributor
Murray hat gesagt.:
Das stimmt so nicht ganz - der Hashcode darf (und sollte) sich ändern, wenn sich irgendwelche Attribute ändern, die in der equals-Methode berücksichtigt werden.
hast du nicht zufälligerweise zuhause einen Quanten-PC herumstehen, in dem ein und dasselbe objekt mehrere zustände gleichzeitig annehmen kann? ;)

edit: okay, für die fragestellung ist die bemerkung zwar ohne bedeutung, aber es stimmt schon, sry, blödes Kommentar :p
 
M

maki

Gast
1. Nein, dasselbe Objekt hat immer denselben Hashcode, der darf sich auch nicht nachträglich ändern, sehr wichtig bei HashSet und HashMap, Hash...
Das stimmt so nicht ganz - der Hashcode darf (und sollte) sich ändern, wenn sich irgendwelche Attribute ändern, die in der equals-Methode berücksichtigt werden.
Wenn das Objekt in eine HashMap eingefügt wurde und sich danach der Wert von hashcode() ändert, bekommt man es nicht mehr aus der HashMap mit get().
 

Murray

Top Contributor
Andrey hat gesagt.:
hast du nicht zufälligerweise zuhause einen Quanten-PC herumstehen, in dem ein und dasselbe objekt mehrere zustände gleichzeitig annehmen kann? ;)

edit: okay, für die fragestellung ist die bemerkung zwar ohne bedeutung, aber es stimmt schon, sry, blödes Kommentar :p
Was genau willst Du mir damit jetzt sagen?
 

Murray

Top Contributor
maki hat gesagt.:
Wenn das Objekt in eine HashMap eingefügt wurde und sich danach der Wert von hashcode() ändert, bekommt man es nicht mehr aus der HashMap mit get().
Das stimmt so nicht - wenn sich der Hashcode eines Values in einer HashMap ändert, kratzt das niemanden. Ändert sich dagegen der Hashcode des beim Einfügen verwendeten Key-Objektes, dann kann man mit diesem Key-Objekt das ursprünglich eingefügte Objekt mit get nicht mehr herausbekommen - das spricht aber erstmal nicht gegen den HashCode-Contract, sondern lediglich dagegen, veränderliche Objekte (mutables) als Keys zu verwenden.
 
S

SlaterB

Gast
aha, aber für alle Objekte, deren hashCode() man nie benutzt, soll sich dieser aber bitte ändern (können) oder wie? ;)
sehr sinnvolle Unterscheidung
 
M

maki

Gast
SlaterB hat gesagt.:
aha, aber für alle Objekte, deren hashCode() man nie benutzt, soll sich diese aber bitte ändern (können) oder wie? ;)
sehr sinnvolle Unterscheidung
Grundlegende Unterscheidung zwischen sog "Value Object" und "Entities".

Value Objects werden durch ihre Attribute eindeutig, zwei Value Objects mitdenselben Werten sollten austauschbar sein, und immutable. equals() und hashcode() beziehen sich dann auf die Attribute.

Entities werden durch ihre id eindeutig, sollten auch nicht mutable sein, equals() und hashcode() beziehen sich dabei auf ein id Attribut.
Problem: Nicht gespeicherte Entities haben keine ID, sind daher nicht unterscheidbar und können nicht in Collections/Maps verwendet werden
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D equals Vergleiche Java Basics - Anfänger-Themen 7
X Erste Schritte Vergleiche Java Basics - Anfänger-Themen 1
W Vergleiche bei generischen Datentypen Java Basics - Anfänger-Themen 7
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
D Wie vergleiche ich zwei BigInteger Werte? Java Basics - Anfänger-Themen 1
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
N Vergleiche mit for schleife Java Basics - Anfänger-Themen 2
I String vergleiche mit == Java Basics - Anfänger-Themen 2
A Quicksort, #Vergleiche zählen klappt nicht Java Basics - Anfänger-Themen 3
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
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
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
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
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
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
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
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals 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
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
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() und hashcode() überschreiben Java Basics - Anfänger-Themen 5
K equals in Hashmap() Java Basics - Anfänger-Themen 4
B if equals(irgendeine Zahl+Buchstabe) Java Basics - Anfänger-Themen 6
T equals() und hashCode() Java Basics - Anfänger-Themen 7
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
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
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
L String mit equals vergleichen Java Basics - Anfänger-Themen 6
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
F String equals null wird nicht angenommen. Java Basics - Anfänger-Themen 24
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben