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)现在,为了也将返回6为,可以做些什么m_map.get(a1) 呢?

4

2 回答 2

3

a1.equals(a2) 必须为真并且 a1.hashCode() 必须等于 a2.hashCode()。

所以你必须重写equals和hashCode(从Object继承的方法认为两个不同的对象是不相等的,并且可能具有不同的hashCodes......)

于 2012-12-27T18:22:51.950 回答
1

中的位置Map是通过使用对象的hashCodeequals方法找到的,因此正确的做法是在您的Class_A此类中覆盖这些方法,即a1.equals(a2)true 和a1.hashCode() == a2.hashCode()

然而,这在我心中敲响了警钟。没有什么理由去克隆一个不可变对象,并且Map键应该是不可变的。有关可变键的风险,请参阅此问题

于 2012-12-27T18:32:36.007 回答