Java clone()查询
写了下面的代码后,我想知道为什么clone()不为每个附加实例返回相同的hashcode。我做错什么了吗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 "
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。