Beispiel ==, equals und hashcode in java
Gegeben:
String s1= new String("abc");
String s2= new String("abc");
String s3 ="abc";
System.out.println(s1==s3);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
Ausgabe:
false
false
true
true
96354
96354
96354
Hier ==
ist das falsche für jedes Objekt, aber der hashcode für jedes String-Objekt ist die gleiche. Warum ist es so?
Du musst angemeldet sein, um einen Kommentar abzugeben.
==
macht vergleichen der tatsächlichen Gleichstellung von Objekte (ich meine, - beide Referenzen auf das gleiche Objekt zeigen), ist nicht Ihr Inhalt, in der Erwägung, dass.equal
vergleicht Inhalt (zumindest für String).a
undb
verweisen auf verschiedene Objekte.Beachten Sie auch, dass wenn zwei Objekte gleich sind, dann Ihre hashchodes muss die gleiche sein, aber wenn die hashcodes gleich sind, bedeutet es nicht, dass die Objekte gleich sind.
Die equals-Vertrag sagt, dass, wenn
o1.equals(o2)
, danno1.hashCode() == o2.hashCode()
. Es ist nicht angegeben, der etwas über die hash-codes der ungleiche Objekte. Sie hätte eine Methode wieund es würde den Vertrag zu erfüllen. Es ist nur zu erwarten, dass der hash-code mit dem Wert der Sache, um zu machen, hash-Tabellen, effizienter zu arbeiten.
Nun, wie, warum Ihr
==
funktioniert nicht, zwei Objekte werden immer im Vergleich von Referenz. Das ist, wenno1 == o2
, danno1
undo2
sind genau dasselbe Objekt. Das ist selten das, was Sie wollen; Sie wollen in der Regel, um zu sehen, wenno1.equals(o2)
statt.Wenn Sie
==
, die Sie vergleichen, wenn zwei Variablen halten Referenz auf das gleiche Objekt. In anderen Wortens1 == s2
ist wie zu Fragen: sind dies1
unds2
Variablen beziehen sich auf dasselbe String-Objekt? Und das ist nicht wahr, wenn beide String-Objekte den gleichen "abc" Wert.Wenn Sie equals(), die Sie vergleichen den Wert für beide Objekte. Beide Objekte können nicht gleich sein, aber Ihr Wert (in diesem Fall "abc") ist gleich, also es gibt
true
.Wie definieren Sie, ob ein Objekt gleich einem anderen? Das ist bis zu Ihnen. In diesem Falle das String-Objekt bereits definiert dies für Sie, aber wenn Sie zum Beispiel definieren Sie eine
Person
Objekt, wie Sie wissen, wenn eine person P1 ist gleich P2? Sie tun, dass durch das überschreibenequals()
undhashCode()
.== erfahren Sie, ob die beiden Variablen Verweise zeigen auf dasselbe Objekt im Speicher, nichts mehr.
equals()
undhashCode()
beide Blick auf den Inhalt des Objekts und jeder verwendet einen eigenen Algorithmus für die Berechnung.