Frage

Typischerweise ist die Standardimplementierung von Object.hashCode() ist eine Funktion der zugewiesenen Adresse des Objekts im Speicher (obwohl dies nicht durch die beauftragt wird JLS ). Da die VM-Shunts Objekte über in Erinnerung, warum der Wert nicht zurück von System.identityHashCode() nie während der Lebenszeit des Objekts ändern?

Wenn es sich um eine „one-shot“ Berechnung (der hashCode des Objekts berechnet wird, sobald und in dem Objekt-Header oder etwas versteckt), bedeutet dann, dass es möglich ist, zwei Objekte den gleichen identityHashCode haben (wenn sie passieren zuerst an der gleichen Adresse im Speicher zugeordnet werden)?

War es hilfreich?

Lösung

Modern JVMs speichern Sie den Wert im Objekt-Header. Ich glaube, der Wert in der Regel nur bei dem ersten Verwendung, um Zeit zu halten in Objektzuordnung auf ein Minimum ausgegeben berechnet wird (manchmal nach unten so niedrig wie ein Dutzend Zyklen). Die gemeinsame Sun JVM kann kompiliert werden, so dass die Identität Hash-Code ist immer 1 für alle Objekte.

Es können mehrere Objekte den gleichen Identität Hash-Code haben. Das ist die Natur von Hash-Codes.

Andere Tipps

In der Antwort auf die zweite Frage, und zwar unabhängig von der Umsetzung ist es möglich, dass mehrere Objekte derselben identityHashCode zu haben.

Siehe

Fehler 6.321.873 für eine kurze Diskussion über die Formulierung in der javadoc, und ein Programm, um nicht-Eindeutigkeit zu zeigen.

Der Header eines Objekts in HotSpot besteht aus einem Klassenzeiger und ein „Zeichen“ Wort.

Der Quellcode der Datenstruktur für die Marke Wort kann die markOop.hpp Datei. In dieser Datei gibt es ein Kommentar zur Beschreibung Speicherlayout der Marke Wortes:

  

hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)

Hier können wir sehen, dass die Identität der Hash-Code für normale Java-Objekte auf einem 32-Bit-System wird in der Markierung Wort gespeichert und es ist 25 Bit lang.

Die allgemeine Richtlinie für eine Hashing-Funktion implementiert ist:

  • das gleiche Objekt sollte eine konsistente hashCode zurückkehren , sollte es nicht mit der Zeit oder hängen von jedem variablen Informationen ändern (zum Beispiel ein Algorithmus durch eine Zufallszahl oder Werte von wandelbaren Mitgliederfelder
  • ausgesät
  • sollte die Hash-Funktion hat eine gute statistische Verteilung , und damit meine ich, wenn Sie den Hash-Code als Eimer betrachten, 2 Objekte in verschiedenen Eimer (Hashcodes) so weit wie möglich abbilden sollten. Die Möglichkeit, dass zwei Objekte würde die gleiche Hash-Code selten sein sollte - auch wenn es können geschehen.

Soweit ich weiß, wird dies implementiert, um die Bezugnahme auf die Rückkehr, die in einem Objekte ändern Lebensdauer nie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top