Java clone()查询

时间:2016-07-17 13:01:41

标签: java clone

编写下面的代码后,我想知道为什么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!!!");

        }
    }

}

3 个答案:

答案 0 :(得分:2)

由于Accessor未覆盖hashCode,您将获得Object.hashCode的默认实施。这具有实现定义的语义,但基本上将对象的地址转换为整数,这样不同的对象实例将具有不同的hashCode

有关上述内容的详情,请参阅What is the default implementation of `hashCode`?

请注意,如果您要实施hashCode,则还应实施equals。有关equalshashCode的良好参考,请阅读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