Java clone()查询

Java clone()查询,java,clone,Java,Clone,写了下面的代码后,我想知道为什么clone()不为每个附加实例返回相同的hashcode。我做错什么了吗 public class Accessor implements Cloneable { public static void main(String[] args) { Accessor one = new Accessor(); Accessor two = one.clone(); System.out.println("one hahcod "

写了下面的代码后,我想知道为什么clone()不为每个附加实例返回相同的hashcode。我做错什么了吗

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!!!");

        }
    }

}

因为它是一个不同的对象。在本例中,您正在调用从对象继承的克隆。对于每个新对象,您将使用不同的dashcode。如果您在java中打开Object的源代码,您将发现以下内容:

 public native int hashCode();

public boolean More ...equals(Object obj) {
        return (this == obj);
    }
这里的关键点是,一旦你克隆了一个对象,一个B A==B的克隆将总是返回false

然后,如果您阅读hashcode文档,它会说明以下内容:

如果两个 根据equals(Object)方法,对象是相等的,然后调用 两个对象中的每个对象上的hashCode方法必须产生相同的结果 整数结果如果两个对象不相等,则不需要 根据equals(java.lang.Object)方法,然后调用 两个对象上的hashCode方法必须产生不同的 整数结果。但是,程序员应该知道 为不相等的对象生成不同的整数结果可以提高 哈希表的性能


因为它是一个不同的对象。在本例中,您正在调用从对象继承的克隆。对于每个新对象,您将使用不同的dashcode。如果您在java中打开Object的源代码,您将发现以下内容:

 public native int hashCode();

public boolean More ...equals(Object obj) {
        return (this == obj);
    }
这里的关键点是,一旦你克隆了一个对象,一个B A==B的克隆将总是返回false

然后,如果您阅读hashcode文档,它会说明以下内容:

如果两个 根据equals(Object)方法,对象是相等的,然后调用 两个对象中的每个对象上的hashCode方法必须产生相同的结果 整数结果如果两个对象不相等,则不需要 根据equals(java.lang.Object)方法,然后调用 两个对象上的hashCode方法必须产生不同的 整数结果。但是,程序员应该知道 为不相等的对象生成不同的整数结果可以提高 哈希表的性能


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

有关上述内容的更多信息,请参阅


请注意,如果要实现
hashCode
,还应该实现
equals
。有关
equals
hashCode
的良好参考,请阅读Joshua Bloch的有效Java(或参见)

,因为
访问器
不会覆盖
hashCode
,您将获得
对象.hashCode>的默认实现。这具有实现定义的语义,但基本上将对象的地址强制转换为整数,这样不同的对象实例将具有不同的
hashCode
s

有关上述内容的更多信息,请参阅


请注意,如果要实现
hashCode
,还应该实现
equals
。有关
equals
hashCode
的参考资料,请阅读Joshua Bloch的有效Java(或参见)

克隆方法创建第一个对象的浅层副本,但访问器类没有实例字段,也没有重写方法,因此,该类的实例从hashCode的对象类获得默认行为。此行为类似于以对象作为参数调用

clone方法创建第一个对象的浅层副本,但访问器类没有实例字段,也没有覆盖方法,因此该类的实例从hashCode的对象类获得默认行为。此行为类似于以对象作为参数调用

因为它是一个不同的对象。在本例中,您正在调用从对象继承的克隆。对于每个新对象,您将使用不同的dashcode。因为它是不同的对象。在本例中,您正在调用从对象继承的克隆。对于每个新对象,您将使用不同的dashcode。