Wie funktionieren hashCode () und identityHashCode () am Backend?
Wie - Objekt.hashCode()
und System.identityHashCode()
arbeiten im back-end? Tut identityHashCode()
Gegenzug die Referenz des Objekts? Tut hashCode()
abhängen ? der Gegenstand ? = = - operator, wie die Arbeit im back-end.
Was ist der Unterschied zwischen hashCode()
und identityHashCode()
?
Kommentar zu dem Problem - Öffnen
Sprechen Sie Java? Mehr Kontext wäre nett...
Ich habe versucht, zu "reparieren", die Frage, aber ich kann einfach nicht verstehen den zweiten Teil der Frage.
Wie funktioniert der JVM sicherzustellen, dass System.identityHashCode() nie ändern wird? Hilfe in clearing einige ambiguousness.
InformationsquelleAutor der Frage Himanshu | 2011-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, dass er noch nicht außer Kraft gesetzt wurde, die
Object.hashCode()
Methode ruft einfachSystem.identityHashCode(this)
.Das genaue Verhalten von
System.identityHashCode(Object)
hängt von der JVM-Implementierung. (Die tatsächliche implementation auf den letzten Hotspot-JVMs ist ziemlich clever, aber ich schweife ab.)Nicht. Es gibt ein
int
, und einint
nicht halten eine Referenz. (Duh!)Dass integer zurückgegeben
identityHashCode
kann in Bezug auf die (eine) Maschine-Adresse für das Objekt, oder es kann nicht sein1. Der Rückgabewert vonidentityHashCode()
ist garantiert nicht zu ändern für die Lebensdauer des Objekts. Dies bedeutet, dass der GC verschiebt ein Objekt (nach einemidentityHashCode()
nennen), dann kann Sie nicht verwenden die neue Objekt-Adresse als Identität hashcode.Ist dies nicht sinnvoll. Es gibt keine
? ==
oder?==
operator in Java.Dies ist zum Teil oben erklärt. Andere Unterschiede sind:
Den
hashcode()
Methode ist eine nicht-Letzte Instanz-Methode, und sollte überschrieben werden, in jeder Klasse, in der dieequals(Object)
überschrieben wird. DagegenidentityHashCode(Object)
ist einstatic
Methode und daher nicht überschrieben werden kann.Den
identityHashCode(Object)
- Methode können Sie einen Bezeichner für ein Objekt, die (in der Theorie) verwendet werden, für andere Dinge als hashing und hash-Tabellen. (Leider ist es nicht eine einzigartige Identifikator, aber es ist garantiert nie ändern, für die Lebensdauer des Objekts.)1 - Für die aktuelle generation JVMs, es ist nicht im Zusammenhang mit der Speicher-Adresse an alle. Siehe @bestsss Antwort.
InformationsquelleAutor der Antwort Stephen C
identityHashCode() arbeitet wie (und es hat nichts zu tun w/die Adresse, esp. da die Adressen sind 64 bit lang, ok so angeordnet, 61)
Überprüft, ob es bereits generiert, wenn ja, gibt es. Sie können davon ausgehen, dass ein Platz in der Objekt-header für das
int
;ansonsten: generiert eine zufällige Zahl (
iirc twisterMarsaglia shift-xor - Algorithmus), jeder einheimische thread hat seinen eigenen Samen, so dass keine gemeinsame info.CAS der
identityHashCode
Feldes in der Objekt-header zu aktualisieren, w/die neu generierte Zahl ist. wenn CAS Erfolg gibt den Wert zurück, wenn nicht - das Feld enthält bereits einen generiertenidentityHashCode
.können Sie sehen, die restlichen Antworten über das überschreiben von hashcode.
bottom line:
wenn Sie die javadoc-Staaten noch etwas über Adressen und identityHashCode, braucht jemanden, um ihn zu aktualisieren.
InformationsquelleAutor der Antwort bestsss
Dies ist sehr viel, die Umsetzung-spezifisch. Die einzige Garantie, die Sie bekommen, ist
(Aus dem Java 1.6 JavaDoc)
In der Theorie bedeutet dies, dass die Werte ermittelt werden konnten, willkürlich und könnte sogar null sein, für jedes Objekt. In der Praxis ist es wohl etwas abgeleitet von der Adresse des Objekts. Natürlich, Sie müssen vorsichtig sein, über diese. Die JVM kann Objekte verschieben, wenn es denkt, es ist eine gute Idee während einer garbage collection, so ist es nicht "nur" der Speicher-Adresse. Könnte es sein, gezeichnet von einer globalen Zähler, oder einen hash des ursprünglichen Objekts, die Lage, oder aus einem Zufallszahlengenerator, etc.
InformationsquelleAutor der Antwort templatetypedef
Siehe [Java docs]
Also, wenn jemand überschrieben hat
hashCode()
Methode in seiner Klasse, aber immer noch wollen, dass die Standard -hashCode()
Wert, der zurückgegeben worden wäre durch ObjekthashCode()
dann verwendenSystem.identityHashCode()
So,
hashCode()
ruft internSystem.identityHashCode()
, solange Sie überschreiben nicht es in Sie Klasse, wenn Sie das überschreiben von hashCode() wird aufgerufen, Ihre Umsetzung.InformationsquelleAutor der Antwort Vishrant