将obj和obj.clone()作为HashMap中的相同键

时间:2012-12-27 18:17:14

标签: java hashmap clone

考虑 -

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)返回,可以做些什么?

2 个答案:

答案 0 :(得分:3)

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

所以你必须覆盖equals和hashCode(来自Object的继承方法认为两个不同的对象是不相等的,可能还有不同的hashCodes ......)

答案 1 :(得分:1)

使用对象的MaphashCode方法找到equals中的位置,因此正确的做法是在Class_A中覆盖这些方法a1.equals(a2)为真,a1.hashCode() == a2.hashCode()

然而,这在我脑海中响起了警钟。没有理由克隆不可变对象,Map键应该是不可变的。有关可变密钥的风险,请参阅this question