Hashcode - Operator ^

Strim

Mitglied
Hallo,

ich habe gerade gesehen dass eine Hashcode-Methode wie folgt überschrieben wurde:

Java:
@Override
public int hashCode ( ) {
return xPosition ^ 31 *  yPosition;
}

Ich verstehe den Sinn nicht, was soll mit ^ erreicht werden und wieso 31?

Mfg,
Tim
 

Tobse

Top Contributor
Code:
^
ist der XOR-Operator (siehe Kontravalenz ? Wikipedia)
31 in binär ist
Code:
11111
. Was das genau mit dem hash-code auf sich hat, kann ich dir leider nicht sagen :/
 

Strim

Mitglied
Hm... noch ne Frage:
Eigentlich ist doch das Überschreiben der Methode hashCode() nur für Klassen wichtig die man als Key verwenden will, nicht aber für Klassen die man als Value in einer Hash-Tabelle verwenden will oder? Hab ich das richtig verstanden?
 

Tobse

Top Contributor
Korrekt. Die Java Collection-Klassen prüfen über
Code:
hashCode()
auf identität. Wenn du aber die Equals-Methode überschreibst, musst du auch die hashCode-Methode überschreiben, sonst kannst du auf Situationen stoßen, die dich Stunden an Arbeit kosten nur um herauszufinden, dass das Problem in einer nicht oder falsch implementierten hashCode-Methode lag.
 

Strim

Mitglied
Die Java Collection-Klassen prüfen über hashCode() auf identität.

Nur die hashbasierten Container wie zB HashMap tun das oder? Wenn ich zB nur ArrayList verwenden will muss ich ja hashCode() nicht überschreiben oder doch?


Ich hab hier zu meiner ersten Frage nochmal die Ganze Aufgabe:
Sie wollen Objekte der folgenden Klasse als Schlüssel in der Hash-Tabelle ablegen. Die
Klasse beschreibt einen Punkt in einem Koordinatensystem. Ergänzen Sie dazu eventuell
erforderliche Methoden.

Java:
public class Point2D {
private int xPosition;
private int yPosition;
}
Java:
public class Point2D {
private int xPosition;
private int yPosition;
@Override
public boolean equals(Object other) {
if (other != null && other.getClass ( ) == getClass ( ) ) {
Point2D otherPoint = (Point2D) other;
return otherPoint.xPosition == xPosition
&& otherPoint.yPosition == yPosition;
}
return false;
}
@Override
public int hashCode ( ) {
return xPosition ^ 31  yPosition;
}
}

Um die hashCode() Methode zu überschreiben hätte ich doch zB auch die Berechnung:
xPosition + yPosition * 3 nehmen können oder? Das liegt ja bei mir oder?

MfG
 

Tobse

Top Contributor
Nur die hashbasierten Container wie zB HashMap tun das oder? Wenn ich zB nur ArrayList verwenden will muss ich ja hashCode() nicht überschreiben oder doch?


Ich hab hier zu meiner ersten Frage nochmal die Ganze Aufgabe:
Sie wollen Objekte der folgenden Klasse als Schlüssel in der Hash-Tabelle ablegen. Die
Klasse beschreibt einen Punkt in einem Koordinatensystem. Ergänzen Sie dazu eventuell
erforderliche Methoden.

Java:
public class Point2D {
private int xPosition;
private int yPosition;
}
Java:
public class Point2D {
private int xPosition;
private int yPosition;
@Override
public boolean equals(Object other) {
if (other != null && other.getClass ( ) == getClass ( ) ) {
Point2D otherPoint = (Point2D) other;
return otherPoint.xPosition == xPosition
&& otherPoint.yPosition == yPosition;
}
return false;
}
@Override
public int hashCode ( ) {
return xPosition ^ 31  yPosition;
}
}

Um die hashCode() Methode zu überschreiben hätte ich doch zB auch die Berechnung:
xPosition + yPosition * 3 nehmen können oder? Das liegt ja bei mir oder?

MfG

Du musst die hashCode funktion nur überschreiben, wenn du die equals-methode auch überschreibst.
Die Methode muss ein Ergebnis liefern, dass eindeutig für die enthaltenen Werte ist, es darf keine zwei Zustände geben, die den gleichen hash-code zur Folge haben.
 

Strim

Mitglied
Aber wenn ich gar keine hash-basierten Container benutzen will aber trotzdem Objekte vergleichen, reicht es doch wenn ich die equals Methode ohne die hashCode Methode überschreib oder nicht?

Wäre xPosition + yPosition * 3 nicht gut als HashCode-Berechnung?
Wie mache ich dann eine gute Berechnung für einen HashCode bei zB solchen 2 int Attributen?
Ich kann mit xPosition ^ 31 *  yPosition nichts anfangen
Mfg
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Aber wenn ich gar keine hash-basierten Container benutzen will aber trotzdem Objekte vergleichen, reicht es doch wenn ich die equals Methode ohne die hashCode Methode überschreib oder nicht?
Doch. Erstens, weil es dem Standard entspricht und zweitens weil du böse darüber stolpern kannst, wenn du es nicht tust.

Wäre xPosition + yPosition * 3 nicht gut als HashCode-Berechnung?
Wie mache ich dann eine gute Berechnung für einen HashCode bei zB solchen 2 int Attributen?
Ich kann mit xPosition ^ 31 *  yPosition nichts anfangen
Mfg
welche IDE benutzt du? In NetBeans gibt es eine eingebaute Funktion dafür.
 

nvidia

Bekanntes Mitglied
Aber wenn ich gar keine hash-basierten Container benutzen will aber trotzdem Objekte vergleichen, reicht es doch wenn ich die equals Methode ohne die hashCode Methode überschreib oder nicht?

Wäre xPosition + yPosition * 3 nicht gut als HashCode-Berechnung?
Wie mache ich dann eine gute Berechnung für einen HashCode bei zB solchen 2 int Attributen?
Ich kann mit xPosition ^ 31 *  yPosition nichts anfangen
Mfg

Auch wenn man gar keinen Hash Code berechnen möchte oder kann (weil z.B. alle Fields veränderbar sind) sollte hashCode() überschrieben werden. Hauptsache hashCode() hält sich an ein paar Regeln und ist konsistent zu equals(). Ganz wichtig ist es das für den hash code nur Attribute verwendet werden die sich über die gesamte Lebenszeit des Objektes nicht ändern. Ist das nicht der Fall und man hat z.B. nur Attribute die alle änderbar sind wird hashCode dennoch überschrieben und meist eine Konstante wie 0 zurückgegeben damit die Konsistenz zu equals() gewährleistet ist.

Es ist wichtig die Gedanken hinter equals()/hashCode() zu verstehen. Eine gute Einführung in equals()/hashCode() findest du hier. Als Anfänger wirst du das wahrscheinlich mehrfach lesen müssen.

AngelikaLanger.com - Implementing the equals() Method - Part 1 - Angelika Langer Training/Consulting
AngelikaLanger.com - Implementing the equals() Method - Part 2 - Angelika Langer Training/Consulting

AngelikaLanger.com - Implementing the hashCode() Method - Angelika Langer Training/Consulting

Und allgemein, dieses Bit-Shifting und die Verwendung einer Primzahl macht man um eine gleichmäßigere Verteilung der Werte innerhalb der Hashtabelle zu erreichen.
 

Strim

Mitglied
Ok, ich verstehe.

Zu zweiterem:
Kann ich mir das also als Faustregel merken zum hashCode berechnen?
feld1 ^ primzahl * feld2 ??

Oder könnt ihr mir irgendeine Faustregel dafür geben zum Berechnen eines hashCodes aus Feldern die sich über die gesamte Lebenszeit eines Objektes nicht ändern?

In der Klausur hat der Prof das ja in den Lösungen mit "xPosition ^ 31 *  yPosition" gemacht... hätte man aber auch anders machen können oder?

MfG
 

nvidia

Bekanntes Mitglied
Ok, ich verstehe.

Zu zweiterem:
Kann ich mir das also als Faustregel merken zum hashCode berechnen?
feld1 ^ primzahl * feld2 ??

Oder könnt ihr mir irgendeine Faustregel dafür geben zum Berechnen eines hashCodes aus Feldern die sich über die gesamte Lebenszeit eines Objektes nicht ändern?

In der Klausur hat der Prof das ja in den Lösungen mit "xPosition ^ 31 *  yPosition" gemacht... hätte man aber auch anders machen können oder?

MfG

Klar kann man das auch anders machen, es gibt einen Haufen verschiedener Hashfunktionen und obendrein könntest du auch immer 0 zurückgeben, das ist genauso eine gültige Hashfunktion aber die Verteilung der Werte ist schlecht. Gute Hashfunktionen zu finden ist nicht so einfach, es hängt vom Datentyp ab, der Länge der Eingabe usw. Es gibt reichlich wissenschaftliche Artikel zu dem Thema.

Wenn euer Prof. das so haben möchte kannst du das so machen. Ob das die "beste" Hashfunktion für das Problem ist kann ich aber nicht sagen, das könnte man mit etwas Aufwand jedoch nachrrechnen oder einfach durch Experimentieren herausbekommen.

Na jedenfalls kannst du dir die Hashfunktion oft von der IDE generieren lassen, Eclipse generiert eine Funktion ähnlich der in Effective Java (ab S. 45 glaube ich) beschriebenen.
Bei der Java-Standardbibliothek ist das auch noch ein wenig anders, da wird der Wert von hashCode() noch einmal "gehasht" wenn man z.B. eine HashMap verwendet. Der Hintergedanke war wohl sich gegen schlechte Hashfunktionen etwas abzusichern.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
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
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
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
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
T Code in hashCode Java Basics - Anfänger-Themen 2
S hashCode() überschreiben Java Basics - Anfänger-Themen 13
T equals() und hashCode() Java Basics - Anfänger-Themen 7
A HashCode Überschreiben Java Basics - Anfänger-Themen 2
H Suche spezifische Eigenschaft von Object - sowas wie ".hashCode()" Java Basics - Anfänger-Themen 4
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
E hashCode bei Objekten Java Basics - Anfänger-Themen 14
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
M Fehler im HashCode()! Java Basics - Anfänger-Themen 12
S equals() - hashCode() - Contract Java Basics - Anfänger-Themen 54
S HashCode überschreiben! Java Basics - Anfänger-Themen 17
D HashCode eines Objekts Java Basics - Anfänger-Themen 5
R Vergleiche mit Equals(), hashCode() und == Java Basics - Anfänger-Themen 10
M HashCode von java.io.File - Wurde die Datei geändert ? Java Basics - Anfänger-Themen 2
B Hashcode?Was ist das und wozu? Java Basics - Anfänger-Themen 2
pkelod Binäre Darstellung Bitwise-Operator Java Basics - Anfänger-Themen 10
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
C ?: Operator Java Basics - Anfänger-Themen 14
L Java operator % Java Basics - Anfänger-Themen 3
KogoroMori21 Erklärung zum Ternären Operator Java Basics - Anfänger-Themen 4
B Modulo-Operator anhand eines Beispieles erklären Java Basics - Anfänger-Themen 7
C Ternärer Operator mit Strings Java Basics - Anfänger-Themen 3
L Modulus Operator Java Basics - Anfänger-Themen 3
A Zuweisungen und -- operator; Java Basics - Anfänger-Themen 2
H << Operator Java Basics - Anfänger-Themen 7
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
H Operatoren Der bedingte Operator ? : ; Java Basics - Anfänger-Themen 2
J new-Operator Java Basics - Anfänger-Themen 6
H this operator - was ist das? Java Basics - Anfänger-Themen 2
R Operatoren Bad operand types for binary operator Java Basics - Anfänger-Themen 4
O Bedingter Operator eine Frage! Java Basics - Anfänger-Themen 10
O Erste Schritte x*y*z mit Shift Operator moeglich? Java Basics - Anfänger-Themen 15
L Operatoren error: bad operand types for binary operator && Java Basics - Anfänger-Themen 8
E Methoden in new-Operator Methode in geschweifter Klammer Java Basics - Anfänger-Themen 3
I bad operand types for binary operator > Java Basics - Anfänger-Themen 5
D Conditional Operator ?: Java Basics - Anfänger-Themen 3
L Operatoren Übungsklausuraufgabe, unbekannter Operator Java Basics - Anfänger-Themen 13
H Operatoren Fehler bad operand types for binary operator Java Basics - Anfänger-Themen 7
snipesss Operator "-" is undefined Java Basics - Anfänger-Themen 1
F Operatoren If mit variabelem Operator Java Basics - Anfänger-Themen 2
J instanceof Operator Java Basics - Anfänger-Themen 3
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
J Operator * benutzen Java Basics - Anfänger-Themen 3
DeVolt Operatoren Frage zum new-Operator Java Basics - Anfänger-Themen 4
N Methoden Modulo Operator Java Basics - Anfänger-Themen 1
S Operatoren ! Operator Java Basics - Anfänger-Themen 4
O Operator undefined Java Basics - Anfänger-Themen 2
N this-Operator Java Basics - Anfänger-Themen 2
ubaro1 Operatoren Der Tide Operator und positive Ganzzahlen in Binär Java Basics - Anfänger-Themen 1
M Shift Operator Java Basics - Anfänger-Themen 3
V XOR-Operator? Java Basics - Anfänger-Themen 5
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
J bad operand types for binary operator Java Basics - Anfänger-Themen 3
T Pixelmanipulation Sobel-Operator Java Basics - Anfänger-Themen 2
K Frage zu Class Operator Java Basics - Anfänger-Themen 2
L The operator && is undefined for the argument type(s) String, boolean Java Basics - Anfänger-Themen 8
C Operatoren | - Operator Java Basics - Anfänger-Themen 10
K .Class Operator unklar Java Basics - Anfänger-Themen 3
B Operator | Java Basics - Anfänger-Themen 11
R Compiler-Fehler Operator + nicht erlaubt? Java Basics - Anfänger-Themen 6
C Was tut der | Operator? Java Basics - Anfänger-Themen 8
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
S Objekt Erzeugung ohne new Operator Java Basics - Anfänger-Themen 6
C Logischer UND Operator funktioniert nicht richtig Java Basics - Anfänger-Themen 5
H Buch: Java lernen mit BlueJ Modulo-Operator Java Basics - Anfänger-Themen 16
K Conditional Operator Java Basics - Anfänger-Themen 16
A Was bedeutet der Operator *= ? Java Basics - Anfänger-Themen 2
A Operator in Java Java Basics - Anfänger-Themen 11
S Modulo Operator Java Basics - Anfänger-Themen 8
C Variablen Problem: variable operator might not have been initialized Java Basics - Anfänger-Themen 9
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
K OOP Wertebereich Ergebnis von % Operator Java Basics - Anfänger-Themen 8
L Frage zu Konstruktoren und dem this Operator Java Basics - Anfänger-Themen 16
R Ersatz für Modulo Operator Java Basics - Anfänger-Themen 8
W &-Operator in diesem Zusammenhang Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben