考虑 -
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)
返回,可以做些什么?
答案 0 :(得分:3)
a1.equals(a2)必须为true且a1.hashCode()必须等于a2.hashCode()。
所以你必须覆盖equals和hashCode(来自Object的继承方法认为两个不同的对象是不相等的,可能还有不同的hashCodes ......)
答案 1 :(得分:1)
使用对象的Map
和hashCode
方法找到equals
中的位置,因此正确的做法是在Class_A
中覆盖这些方法a1.equals(a2)
为真,a1.hashCode() == a2.hashCode()
。
然而,这在我脑海中响起了警钟。没有理由克隆不可变对象,Map
键应该是不可变的。有关可变密钥的风险,请参阅this question。