0

考える-

public class Class_A {
    // members ...
    @Override
    protected Object clone() throws CloneNotSupportedException {
        ...
    }
}

HashMap<Class_A, Integer> m_map = new HashMap<Class_A, Integer>(); 
Class_A a1 = new Class_A() ; 
Class_A a2 = (Class_A) a1.clone();
m_map.put(a1,6) ;

さて、それもとしてm_map.get(a2)戻るために何ができる でしょうか?6m_map.get(a1)

4

2 に答える 2

3

a1.equals(a2) は true で、a1.hashCode() は a2.hashCode() と等しくなければなりません。

そのため、equals と hashCode をオーバーライドする必要があります (Object から継承されたメソッドは、2 つの異なるオブジェクトを等しくなく、おそらく異なる hashCode を持つと見なします...)

于 2012-12-27T18:22:51.950 に答える
1

の場所MapはオブジェクトhashCodeequalsメソッドを使用して検出されるため、正しい方法は、trueと。のClass_Aようにこれらのメソッドをオーバーライドすることです。a1.equals(a2)a1.hashCode() == a2.hashCode()

しかし、これは私の心の中で何か警鐘を鳴らします。不変オブジェクトのクローンを作成する理由はほとんどなく、Mapキーは不変である必要があります。可変キーのリスクについては、この質問を参照してください。

于 2012-12-27T18:32:36.007 に答える