2016-07-17 39 views
0

Nachdem ich den folgenden Code geschrieben habe, habe ich mich gefragt, warum clone() nicht den gleichen Hashcode für jede weitere Instanz zurückgibt. Mache ich etwas falsch?Java Klon() Anfrage

public class Accessor implements Cloneable { 

    public static void main(String[] args) { 

    Accessor one = new Accessor(); 
    Accessor two = one.clone(); 

    System.out.println("one hahcod " + one.hashCode() 
    +"\ntwo hashcode " + two.hashCode());  

    } 

    public Accessor clone(){ 

     try{ 

      return (Accessor)super.clone(); 

     } 
     catch (CloneNotSupportedException err){ 

      throw new Error("Error!!!"); 

     } 
    } 

} 
+0

Weil es ein anderes Objekt ist. Sie rufen in diesem Fall das Klonen auf, das von Object geerbt wurde. Für jedes neue Objekt haben Sie einen anderen Strichcode. –

Antwort

2

Da Accessor nicht hashCode außer Kraft setzen, werden Sie die Standardimplementierung von Object.hashCode bekommen. Dies hat implementationsdefinierte Semantik, aber wird im Grunde die Adresse des Objekts in eine Ganzzahl umwandeln, so dass verschiedene Objektinstanzen verschiedene s haben.

Weitere Informationen hierzu finden Sie unter What is the default implementation of `hashCode`?. Wenn Sie hashCode implementieren, sollten Sie auch equals implementieren. Für eine gute Referenz auf equals und hashCode, lesen Joshua Bloch Effective Java (oder sehen Best implementation for hashCode method)

1

Weil es ein anderes Objekt ist. Sie rufen in diesem Fall das Klonen auf, das von Object geerbt wurde. Für jedes neue Objekt haben Sie einen anderen Strichcode. Wenn Sie den Quellcode von Object in Java öffnen, was werden Sie feststellen, es ist die folgende:

public native int hashCode(); 

public boolean More ...equals(Object obj) { 
     return (this == obj); 
    } 

Der entscheidende Punkt ist hier, dass ist, wenn Sie ein Objekt ein Klon von B A klonen == B immer false zurück.

Dann, wenn Sie die Hash-Code-Dokumentation lesen heißt es wie folgt vor:

Wenn zwei Objekte gleich sind gemäß der equals (Object) -Methode, dann die Methode hashCode auf jeder der beiden Objekte aufrufen müssen produzieren das gleiche Integer Ergebnis. Wenn zwei Objekte ungleich gemäß der Methode equals (java.lang.Object) sind, ist es nicht erforderlich, dass der Aufruf der Methode hashCode für jedes der beiden Objekte eindeutige Ganzzahlenergebnisse ergibt. Der Programmierer sollte jedoch beachten, dass eindeutige Integer-Ergebnisse für ungleiche Objekte erzeugen kann die Leistung von Hashtabellen verbessern.

1

Der Klon-Methode erstellt eine flache Kopie des ersten Objektes, sondern Ihre Accessor Klasse hat keine Instanz Feld und überschreibt nicht hashCode Methode, daher erhalten die Instanzen dieser Klasse das Standardverhalten von Object-Klasse für hashCode. Dieses Verhalten ähnelt dem Aufruf von System#identityHashCode mit Ihrem Objekt als Parameter.