hashCode() verändert sich

pg1337

Bekanntes Mitglied
Morgen,

habe ne Frage bezüglich der hashcode() - Methode.

Hier n kleines Programm:

Java:
public class MainHash {
	
	public static void main(String[] args) {

		Person p1= new Person("Schind", "Phil", 18);
		Person p2= new Person("Schind", "Phil", 18);
		
		p1=p2;
		
		System.out.println(p1.hashCode());
		System.out.println(p2.hashCode());		
	}
}

Java:
public class Person {
	
	String name, vorname;
	int alter;
	
	public Person(String name, String vorname, int alter){
		this.name= name;
		this.vorname=vorname;
		this.alter=alter;
		
	}
}


in der main rufe ich den hashcode() auf, dieser verändert sich jedoch beim 4en - 5en mal Ausführen des Programms:



Ausgabe 1:

714682869
714682869

Ausgabe 2:

798941612
798941612



Woran liegt das?
greetz
 

AlexSpritze

Bekanntes Mitglied
Erklär mal, was du in Zeile 8 von MainHash machst...

Darüber hinaus solltest du vielleicht für Person die hashCode() Methode überschreiben.
 

tfa

Top Contributor
Deine Person-Klasse implementiert die hashCode()-Methode nicht. In dem Fall gilt die Default-Implementierung von java.lang.Object, und die gibt einen nicht näher spezifizierten Wert zurück, der von Session zu Session unterschiedlich sein kann.
 

pg1337

Bekanntes Mitglied
Jetzt überschreibt die Klasse Person hashcode, kommen immernoch gleiche Ergebnisse.
Hab diese Methode noch nicht oft aufgerufen, also net böse sein wenn ich da was falsch mache jetzt nur am Rande mal benutzt :p

Java:
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}
}
 

AlexSpritze

Bekanntes Mitglied
Die Membervariablen sollten schon mit in die Berechnung des HashCodes eingehen, ungefähr so:

Java:
public class Person {

	String name, vorname;
	int alter;
	
	public Person(String name, String vorname, int alter){
		this.name= name;
		this.vorname=vorname;
		this.alter=alter;
		
	}

  public int hashCode(){
    return alter + (vorname!=null?vorname.hashCode()*37:0) + (name!=null?name.hashCode()*31:0);
  }
}

Aber jede vernünftige IDE kann dir da automatisch eine hashCode-Methode generieren.
 

tfa

Top Contributor
Wenn man hashCode() implementiert, sollte man auch equals() entsprechend implementieren.
In Eclipse geht das z.B. automatisch mit "Source->generate hashCode() and equals()".
 

tuttle64

Bekanntes Mitglied

Leider fehlen mir auf obiger Seite die zwei wichtigsten Regeln zwischen equals() und hashCode():

1. falls x.equals(y) == true, dann muss auch x.hashCode()==y.hashCode() true liefern
2. falls x.hashCode()!=y.hashCode() true, dann muss auch x.equals(y) == false sein!

Zudem gilt, dass equals() mindestens die gleichen Attribute wie hashCode() berücksichtigen muss, es dürfen aber auch mehr sein.
 
N

nillehammer

Gast
2. falls x.hashCode()!=y.hashCode() true, dann muss auch x.equals(y) == false sein!
Das ist laut Kontrakt keine MUSS-Anforderung, sondern nur eine SOLLTE-Anforderung. Es ist aber auf jeden Fall SEHR ratsam, sich daran zu halten.
 
S

Spacerat

Gast
Das ist laut Kontrakt keine MUSS-Anforderung, sondern nur eine SOLLTE-Anforderung. Es ist aber auf jeden Fall SEHR ratsam, sich daran zu halten.
Irrtum... das ist lt. Kontrakt sehrwohl ein muss, ist nämlich der Umkehrschluss zu erstens. Was aber dagegen auch noch geht: [c](x.hashCode() == y.hashCode()) != x.equals(y)[/c] und das ist im Kontrakt das KANN.
 

AlexSpritze

Bekanntes Mitglied
Was aber dagegen auch noch geht: [c](x.hashCode() == y.hashCode()) != x.equals(y)[/c] und das ist im Kontrakt das KANN.

Das ist aber auch klar, wenn man sich überlegt, dass man mehr Objekte hat, als es verschiedene ints gibt. Dann muss es zwangsläufig irgendwie zu Kollisionen kommen. Oder alle möglichen Long-Werte als String-Repräsentation, und von diesen String hashCode() aufrufen, da gibt es auch Kollisionen. (Meist aber leider schon früher ;))
 

tuttle64

Bekanntes Mitglied
Das ist laut Kontrakt keine MUSS-Anforderung, sondern nur eine SOLLTE-Anforderung. Es ist aber auf jeden Fall SEHR ratsam, sich daran zu halten.

Für mich bedeutet ein "required" ein MUSS, damit auch dir Logik von equals() und hashCode() auf die verwendeten Collection zutrifft. Die erste Regel besagt nichts anderes, dass zwei gleiche Objekte den gleichen hashCode() haben müssen, ansonsten ist der hashCode() fehlerhaft. Umgekehrt besagt die zweite Regel, dass der hashCode() von zwei ungleichen Objekten ebenfalls ungleich sein muss! Wenn man diese zwei Regel auf z.B. einen HashSet anwendet, sind sie einleuchtend.

Zur Vollständigkeit noch die "Not Required (But Allowed)" Kontraktpunkte:
1. Wenn x.hashCode() == y.hashCode(), dann sollte auch x.equals(y) == true zutreffen, muss aber nicht.
2. Wenn x.equals(y) == false, dann gibt es keine Anforderungen an den hashCode()
 

tfa

Top Contributor
Umgekehrt besagt die zweite Regel, dass der hashCode() von zwei ungleichen Objekten ebenfalls ungleich sein muss!
Nein, andersrum! Wenn die Hashcodes verschieden sind, sind die Objekte ungleich. Ungleiche Objekte können aber trotzdem gleiche Hashcodes haben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T HashCode korrekt Allgemeine Java-Themen 7
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
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
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
J String Variable verändert sich plötzlich Allgemeine Java-Themen 8
S Best Practice System.arrayCopy verändert Ziel-Array Allgemeine Java-Themen 2
T Static kann nicht verändert werden Allgemeine Java-Themen 3
P Zuweisung verändert den Ausgangswert Allgemeine Java-Themen 7
X Über ArrayList iterieren, während sich diese verändert Allgemeine Java-Themen 3
F Wie verändert sich die Göße einer verschlüsselten Datei? Allgemeine Java-Themen 2
M JTable verändert Position auf meinem JPanel Allgemeine Java-Themen 3
C Übergabe Parameter verändert Allgemeine Java-Themen 5
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
A Eclipse hängt sich auf Allgemeine Java-Themen 7
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
Viper13125 Eclipse Hängt sich auf, wenn ich SimpelDateFormat drin lasse Allgemeine Java-Themen 2
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
D Anfänger versucht sich an Xtext Allgemeine Java-Themen 0
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
P JavaFX Anwendung beendet sich selbst nur als Jar Allgemeine Java-Themen 40
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
J Bilder lassen sich nicht importieren Allgemeine Java-Themen 3
E GUI.jfm lässt sich nicht mehr öffnen Allgemeine Java-Themen 1
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
D System.arraycopy verhält sich seltsam Allgemeine Java-Themen 1
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
D Best Practice Gesamten Bildschirminhalt auslesen und Email schicken sobald kein Pixel sich ändert Allgemeine Java-Themen 11
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
X Sich wiederholende substrings finden Allgemeine Java-Themen 6
P Input/Output Inputstream verhält sich verschieden Allgemeine Java-Themen 9
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
K Java installiert sich nicht ganz Allgemeine Java-Themen 15
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
L Jar lässt sich nicht öffnen Allgemeine Java-Themen 12
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
F Wert ändert sich nicht Allgemeine Java-Themen 12
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
M Programm startet sich selbst neu, alte Logfiles bleiben gesperrt Allgemeine Java-Themen 2
K Java lässt sich nicht Installieren Windows7Ultimate 64Bit Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
I JPanel soll sich dem JFrame anpassen Allgemeine Java-Themen 1
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
L Prog läuft in der IDE, hängt sich aber am Mac auf Allgemeine Java-Themen 0
F Spiel lässt sich nicht aus GUI starten Allgemeine Java-Themen 5
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
G Services verwenden sich gegenseitig Allgemeine Java-Themen 4
A Auswahl eines JEditorPane das Sich in einem JScrollPanel Befindet Allgemeine Java-Themen 2
J kann eine .jar sich selbst verschieben? Allgemeine Java-Themen 6
M Erkennen, in welcher Methode sich die VM befindet Allgemeine Java-Themen 6
Rudolf In wie fern lohnt sich C++ für einen Javaentwickler Allgemeine Java-Themen 70
A Selbsterstellte 404-Seiten bestimmen, die sich als 200 ausgeben Allgemeine Java-Themen 8
D Arrays überschreiben sich Allgemeine Java-Themen 2
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
D Dialog soll sich beim Klick auf Button schließen Allgemeine Java-Themen 8
N Java lässt sich nicht löschen! Allgemeine Java-Themen 7
Jats Programm mit CMD Befehl hängt sich auf oder gibt error = 5 aus Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben