2016-07-17 4 views
0

以下のコードを書いて、clone()が追加のインスタンスごとに同じハッシュコードを返さないのはなぜかと思いました。私は何か間違っているのですか?Java clone()inquiry

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

別のオブジェクトですので。この場合、Objectから継承したクローンを呼び出すことになります。新しいオブジェクトごとに異なるダッシュコードが表示されます。 –

答えて

2

AccessorhashCodeを上書きすることはありませんので、あなたはObject.hashCodeのデフォルトの実装を取得します。これは実装定義のセマンティクスを持ちますが、基本的にオブジェクトのアドレスを整数にキャストして、別個のオブジェクトインスタンスが異なるhashCodeを持つようにします。

上記の詳細については、What is the default implementation of `hashCode`?を参照してください。

hashCodeを実装する場合は、equalsも実装する必要があります。 equalshashCodeに良い参考のため、ジョシュア・ブロックの効果的なJavaの読み(またはBest implementation for hashCode methodを参照)

1

これは別のオブジェクトであるためです。この場合、Objectから継承したクローンを呼び出すことになります。新しいオブジェクトごとに異なるダッシュコードが表示されます。あなたは以下があるでしょうどのようなJavaでオブジェクトのソースコードを開く場合:

public native int hashCode(); 

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

ここで重要なポイントは、あなたがオブジェクトのクローンを作成後、B A == Bのクローンは常にfalseを返すことです。あなたはハッシュコードのドキュメントを読んでいる場合

は、その後、それは次のように述べている:

2つの のオブジェクトが、その後なければならない2つのオブジェクトでhashCodeメソッド を呼び出し、等号(Object)メソッドに従って等しい場合同一の 整数結果を生成する。 equals(java.lang.Object)メソッドに従って2つのオブジェクトが等しくない場合は、 の2つのオブジェクトのそれぞれに対してhashCodeメソッドを呼び出す必要があります。しかし、プログラマは、等しくないオブジェクトに対して別の整数結果を生成する がハッシュテーブルのパフォーマンスを向上させる可能性があることに注意してください。

1

cloneメソッドは、あなたの最初のオブジェクトの簡易コピーを作成しますが、あなたのアクセサクラスは何のインスタンスフィールドを持っていないし、上書きしませんhashCodeメソッドを使用すると、このクラスのインスタンスは、オブジェクトクラスのhashCodeのデフォルト動作を取得します。この動作は、オブジェクトとしてパラメータとしてSystem#identityHashCodeを呼び出すのと同じです。