2009-12-24 11 views

Antwort

7

Java generiert nicht hashCode(), d. H. Hier passiert nichts Automatisches. Object generiert jedoch einen HashCode basierend auf der Speicheradresse der Instanz des Objekts. Die meisten Klassen (insbesondere wenn Sie sie in einer der APIs Collection verwenden) sollten ihren eigenen HashCode implementieren (und im Vertrag ihre eigene equals-Methode).

+0

Von der Object.java Datei 'genommen wurde (Dies ist ** ** typischerweise implementiert durch die ** ** interne Adresse des Objekts in eine ganze Zahl konvertieren, aber diese Implementierung Technik ist ** nicht ** von der Java TM Programmiersprache erforderlich.) '- betonen meine. –

+0

Gibt dieser hashCode einen anderen Wert zurück, nachdem das Objekt verschoben wurde, als GC passiert ist? – Jacky

+2

Die Idee, dass HashCode die Speicheradresse verwendet, ist ein historisches Artefakt http://stackoverflow.com/questions/36236615/does-object-tostring-or-object-hashcode-ever-give-the-memory-address-of-the -obje – Raedwald

23

Die hashCode() von Object ist eigentlich eine native Methode und die Implementierung ist eigentlich kein reines Java. Nun, die in Bezug auf, wie es funktioniert, tut this answer from Tom Hawtin eine große Aufgabe es zu erklären:

Viele Leute werden behaupten, dass Object.hashCode die Adresse der Objektdarstellung im Speicher zurück. In modernen Implementierungen bewegen sich Objekte tatsächlich innerhalb des Speichers. Stattdessen wird ein Bereich des Objektheaders verwendet, um den Wert zu speichern, der von der Speicheradresse zu der Zeit, zu der der Wert zum ersten Mal angefordert wird, abgeleitet werden kann.

Die ganze Antwort ist tatsächlich das Lesen wert.

5

Gemäß der Java Platform API-Dokumentation basiert die Berechnung von Hashcode auf der internen 32-Bit-JVM-Adresse des Objekts.

Es ist wahr, dass das Objekt während der Ausführung bewegt (AFAIK der einzige Grund ist Garbage Collector). Aber der Hashcode ändert sich nicht.

Also, wenn Sie ein Objekt haben wie diese

Person person1 = new Person(); 
person1.setName("Alex"); 

Person person2 = new Person(); 
person2.setName("Alex"); 

Person person3 = person2; 

In diesem Fall person1.hashCode nicht zu person2.hashCode gleich sein, da die Speicheradressen dieser beiden Objekte sind nicht das gleiche.

Aber person2.hashCode ist gleich person3, weil sie auf das gleiche Objekt zeigen.

Wenn Sie also die hashCode-Methode für Ihre Objekte verwenden müssen, müssen Sie sie selbst implementieren.

Übrigens String.hashCode Implementierung ist anders. Es ist so etwas wie folgt aus: (C# Syntax)

public int hashCode(String str) 
{ 
    int h = 0; 

    for (int i = 0; i < str.Length; i++) 
    h = (h * 31) + str[i]; 

    return h; 
} 

edit: Kein Überlaufprüfung wird hier getan, so dass die hashCode positiv oder negativ sein kann.

1

Java generiert keine aussagekräftigen hashCode für Sie, es ist Ihre Aufgabe als Programmierer, eine nützliche hashCode zu generieren. Der Standardwert hashCode ist nur der Speicherort.

+3

Ungenau - der Standard-Hashcode basiert auf dem Speicherort * beim ersten Aufruf der Methode * für das Objekt; siehe @ Pascals Antwort. –

+0

Guter Punkt, ordnungsgemäß notiert. – fastcodejava

4

Die Object.hashCode() verwendet die System.identityHashCode(), die auf einer ID-Nummer für ein bestimmtes Objekt basiert.

1

Die HashCode() - Funktion hat mehrere Optionen zum Erstellen eines Hash-Codes. Es legt den Startparameter JVM fest.Funktion, die hashCode() geschrieben am C++ erstellen, und Sie können Code here

  • HashCode == 0 siehe: gibt einfach Zufallszahl mit keinem Verhältnis zu dem im Speicher das Objekt gefunden wird. Soweit ich das feststellen kann, ist das globale Read-Write des Seeds nicht optimal für Systeme mit vielen Prozessoren.
  • HashCode == 1: Zählt die Hash-Code-Werte, nicht sicher bei welchem ​​Wert sie beginnen, aber es scheint ziemlich hoch.
  • HashCode == 2: Gibt immer den exakt identischen Hashcode 1 zurück. Dies kann zum Testen von Code verwendet werden, der auf Objektidentität angewiesen ist. Der Grund, warum JavaChampionTest Kirk's URL im obigen Beispiel zurückgegeben hat, ist, dass alle Objekte denselben Hash-Code zurückgegeben haben.
  • HashCode == 3: Zählt die Hash-Code-Werte, beginnend bei Null. Es scheint threadsicher nicht zu sein, so dass mehrere Threads Objekte mit demselben Hash-Code generieren können.
  • HashCode == 4: Dies scheint eine Beziehung zum Speicherort zu haben, bei dem das Objekt erstellt wurde.
  • HashCode> = 5: Dies ist der Standardalgorithmus für Java 8 und hat einen pro-Thread-Seed. Es verwendet Marsaglias Xor-Shift-Schema, um Pseudozufallszahlen zu erzeugen.

Die Informationen aus here

+2

Wie ist das eine Antwort auf die Frage des OP? Das könnte ein Kommentar gewesen sein. – Mike

+0

Warum hat meine Platte nicht reagiert? –

+0

Dies ist eine viel bessere Antwort auf die Frage mit der Bearbeitung, die Sie hinzugefügt haben. Schade, dass die OP immer noch einen anderen Weg wählt. – Mike

Verwandte Themen