编写下面的代码后,我想知道为什么clone()不会为每个附加实例返回相同的哈希码。我做错了吗?
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 :(得分:2)
由于Accessor
未覆盖hashCode
,您将获得Object.hashCode
的默认实施。这具有实现定义的语义,但基本上将对象的地址转换为整数,这样不同的对象实例将具有不同的hashCode
。
有关上述内容的详情,请参阅What is the default implementation of `hashCode`?。
请注意,如果您要实施hashCode
,则还应实施equals
。有关equals
和hashCode
的良好参考,请阅读Joshua Bloch的 Effective Java (或参见Best implementation for hashCode method)
答案 1 :(得分:1)
因为它是一个不同的对象。在这种情况下,您正在调用从Object继承的克隆。对于每个新对象,您将拥有不同的破折号。如果您在java中打开Object的源代码,您会发现以下内容:
public native int hashCode();
public boolean More ...equals(Object obj) {
return (this == obj);
}
这里的关键点是,克隆一个对象B A == B的克隆将始终返回false。
然后,如果您阅读哈希码文档,则说明以下内容:
如果两个 对象根据equals(Object)方法相等,然后调用 两个对象中的每一个上的hashCode方法必须生成相同的 整数结果。 如果两个对象不相等,则不需要 根据equals(java.lang.Object)方法,然后调用 每个两个对象上的hashCode方法必须产生不同的 整数结果。但是,程序员应该意识到这一点 为不相等的对象产生不同的整数结果可以改善 哈希表的表现。
答案 2 :(得分:1)
clone方法创建第一个对象的浅表副本,但 Accessor 类没有实例字段,并且不会覆盖hashCode方法,因此此类的实例得到了来自 hashCode 的Object类的默认行为。此行为类似于以对象作为参数调用System#identityHashCode。