HashCode korrekt

TomTank

Mitglied
Ich habe aus einem Programm folgende Codezeilen:

Java:
private Set<Link> links = new HashSet<>();
@Override
public int hashCode() {
int refidHashCode = refid.hashCode();
int linkHashCode =
link != null ? link.intValue() : (int)
Math.random();
return refidHashCode + linkHashCode;
}

@Override
public boolean equals(final Object obj) {
return Objects.equals(link, obj);
}

Ich frag mich gerad ob dieses korrekt implementiert ist.
 

KonradN

Super-Moderator
Mitarbeiter
Ich frag mich gerad ob dieses korrekt implementiert ist.
Also uns fehlen erst einmal viele Informationen - da werden Variablen genutzt, die wir nicht kennen.
Und auch die Regeln sind uns nicht bekannt. Wie soll es sich verhalten?

Aber es sieht extrem dubios aus:
- Ein Zufallswert bei hashCode? Was soll der Sinn dahinter sein?
- Equals vergleicht eine Instanzvariable des Wrapper Objekts mit dem Objekt? Das solltest Du mir ggf. auch einmal erklären.
- int refidHashCode = refidHashCode.hashCode(); Eine neue lokale Variable? Und in der Zuweisung eines Wertes nutzt du die Variable selbst? Und rufst auf einer int Variablen hashCode auf? Das wird sich vermutlich nicht übersetzen lassen.
 

Robert Zenz

Top Contributor
Nein, das ist boese.

Solange link null ist wird ein *zufaelliger* Hash-Code retourniert, das bricht *jede* Logik.

Sieh dir mal die Dokumentation von Object.equals und Object.hashCode an, da steht drinnen welche Bedingungen genau erfuellt sein muessen. Als ergaenzung dazu rate ich zum Kapitel in Effective Java zu dem Thema.

Kurz: Folgende Bedingung muss immer gegeben sein a.equals(b) == (a.hashCode() == b.hashCode()). Also equals und hashCode muessen immer symmetrisch sein. Wenn die Objekte uebereinstimmen, muessen sie auch den gleichen Hash-Code haben. Wenn sie nicht uebereinstimmen, muessen sie unterschiedliche Hash-Codes haben. Wenn die nicht symmetrisch sind, zerbrichst du damit einen Haufen Klassen, unter anderem HashSet/HashMap, und das kann neben mieser Laufzeitleistung auch zu unerwarteten Ergebnissen fuehren. In diesem fall sogar zu unnachvollziehbaren weil Zufall mit drinnen ist.

Es wird sogar noch schlimmer, Math.random() liefert naemlich einen double. Durch das ternaere if wird dieser leise zu einem int geschnitten, und ist damit immer 0. Ohne das ternaere if wuerdest du den Fehler sehen und der Code wuerde nicht kompilieren.

Java:
int linkHashCode = Math.random(); // Compiler Fehler

@KonradN Das naechste Script wird eines, das feststellt das ich gerade im Thema tippe, und dann jedes mal deinen Browser abschieszt oder ausbremst wenn du auch tippen willst. ;)
 

TomTank

Mitglied
Danke euch beiden. Ich habe den Quellcode auch nur aus einem anderen Programm und habe mir die gleichen Gedanken gemacht, war mir aber unsicher. - Ich fands auch etwas strange.
 

mihe7

Top Contributor
Zusätzlich, zu dem bereits geschriebenen: wenn Du in equals bereits Objects verwendest, warum nicht auch in hashCode? return Objects.hash(refid, link);
 

KonradN

Super-Moderator
Mitarbeiter
Da ich mir recht sicher bin, dass ich es per Copy & Paste kopiert habe, wird der Post noch einmal editiert worden sein.

Und ich meine mich zu erinnern, dass ein Post in den ersten Minuten editiert werden kann, ohne dass es angezeigt wird als editierter Beitrag.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
pg1337 hashCode() verändert sich Allgemeine Java-Themen 15
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M hashCode() Allgemeine Java-Themen 3
A HashCode von DatagrammPacket(content) erzeugen. Allgemeine Java-Themen 3
N hashCode() für zwei ints Allgemeine Java-Themen 5
C hashCode() Allgemeine Java-Themen 2
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
hdi Wahrscheinlichkeitsfrage bei hashCode() mit modulo Allgemeine Java-Themen 7
Guybrush Threepwood HashCode-Generierung Allgemeine Java-Themen 4
G hashCode() == Speicheradresse? => warum nur int? Allgemeine Java-Themen 28
X hashCode() Berechnung Allgemeine Java-Themen 5
M hashCode Allgemeine Java-Themen 9
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
T hashCode() erzeugen. Allgemeine Java-Themen 11
T eine Frage zu hashCode() Allgemeine Java-Themen 11
U Hashtables und hashCode() Allgemeine Java-Themen 6
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
D Java zeigt Buttons nicht korrekt an Allgemeine Java-Themen 0
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
J Datei per UDP korrekt übertragen Allgemeine Java-Themen 11
K MD5 funktioniert nicht korrekt !? Allgemeine Java-Themen 9
L Java Applet - ClassNotFound online, offline korrekt Allgemeine Java-Themen 13
J Mockito Iterator korrekt mocken Allgemeine Java-Themen 5
M RS232 nur erste Übertragung korrekt Allgemeine Java-Themen 7
N URL einlesen -> Daten sind nicht vollständig bzw. korrekt Allgemeine Java-Themen 9
D Datum korrekt erkennen Allgemeine Java-Themen 27
G Überprüfung der Eingabe ob Typ korrekt Allgemeine Java-Themen 4
oliver1974 Wie ResourceBundles mit Unicode Zeichen korrekt einlesen? Allgemeine Java-Themen 4
G Escape-Sequenzen werden nicht korrekt umgesetzt Allgemeine Java-Themen 6
C String korrekt übergeben Allgemeine Java-Themen 8
S [Base64] Encoding von String nicht korrekt Allgemeine Java-Themen 5
M Ist das MVC korrekt? Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben