Angenommen, ich habe meine eigene Klasse
public class MyObj { /* ... */ }
Es hat einige Attribute und Methoden. Es implementiert NICHT gleich, implementiert NICHT hashCode.
Was sind die Standardimplementierungen, wenn wir equals und hashCode aufrufen? Aus der Objektklasse? Und was sind sie? Wie funktioniert die Standardeinstellung? Wie funktioniert der Standard-Hashcode und was wird zurückgegeben? == prüft nur, ob sie auf dasselbe Objekt verweisen, also ist es einfach, aber was ist mit den Methoden equals () und hashCode ()?
v6u23 ea
:public native int hashCode();
Es gibt Standardimplementierungen von
equals()
undhashCode()
in Object. Wenn Sie keine eigene Implementierung bereitstellen, werden diese verwendet. Fürequals()
bedeutet dies einen==
Vergleich: Die Objekte sind nur dann gleich, wenn sie genau dasselbe Objekt sind. DennhashCode()
der Javadoc hat eine gute Erklärung.Weitere Informationen finden Sie unter Effektives Java, Kapitel 3 (pdf), Punkt 8.
quelle
Ja, aus der
Object
Klasse, da Ihre Klasse Object implizit erweitert.equals
kehrt einfach zurückthis == obj
.hashCode
Implementierung ist nativ. Nur eine Vermutung - es gibt den Zeiger auf das Objekt zurück.quelle
Wenn Sie keine eigene Implementierung bereitstellen, wird eine von Object abgeleitete verwendet. Dies ist in Ordnung, es sei denn, Sie planen, Ihre Klasseninstanzen in HashSet (eine Sammlung, die tatsächlich hashCode () verwendet) oder in etwas, das die Gleichheit des Objekts überprüfen muss (dh die Methode includes () von HashSet), abzulegen. Andernfalls funktioniert es nicht richtig, wenn Sie danach fragen.
Dank HashCodeBuilder und EqualsBuilder von Apache Commons Lang ist es recht einfach, diese Methoden selbst zu implementieren .
quelle
Foo
undBar
Verweise auf zwei verschiedene Instanzen eines veränderlichen Typs sind und es eine Methode gibt (z. B.SomeMutatingMethod
), dieFoo.SomeMutatingMethod()
sich nicht aufBar
die gleiche Weise auswirktFoo
, sollte dieser Unterschied ausreichen, um die Objekte als ungleich anzusehen.IBMs Developerworks sagt:
Um jedoch die genauen Implementierungsdetails für die Java-Version eines bestimmten Anbieters zu ermitteln, ist es wahrscheinlich am besten, als Quelle zu suchen (sofern verfügbar).
quelle