HashSet clone() 方法
HashSet clone() method
我已经使用 clone() 创建了现有 HashSet 的克隆,然后如下比较它们的引用:
HashSet<Employee> h = new HashSet<>();
HashSet<Employee> h1=(HashSet<Employee>) h.clone();
System.out.println(h==h1);
输出:
false
既然我们正在创建浅拷贝,这不应该是真的吗?
在 java == for objects 检查对象是否是完全相同的对象。
如果你去检查克隆方法:
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
很容易看出它正在创建一个新对象。所以现在你有两个不同的对象,它们几乎相等
HashSet
overrides the clone()
method of Object
class
The general intent is that, for any object x, the expression:
x.clone() != x
will be true, and that the expression:
x.clone().getClass() == x.getClass()
will be true, but these are not absolute requirements. While it is typically the case that:
x.clone().equals(x)
will be true, this is not an absolute requirement.
按照惯例,此方法返回的对象应该 独立于此对象(正在克隆)。
在 Java 中,==
检查引用而不是对象,因此 h==h1
在您的情况下是 false
。
我已经使用 clone() 创建了现有 HashSet 的克隆,然后如下比较它们的引用:
HashSet<Employee> h = new HashSet<>();
HashSet<Employee> h1=(HashSet<Employee>) h.clone();
System.out.println(h==h1);
输出:
false
既然我们正在创建浅拷贝,这不应该是真的吗?
在 java == for objects 检查对象是否是完全相同的对象。
如果你去检查克隆方法:
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
很容易看出它正在创建一个新对象。所以现在你有两个不同的对象,它们几乎相等
HashSet
overrides the clone()
method of Object
class
The general intent is that, for any object x, the expression:
x.clone() != x
will be true, and that the expression:
x.clone().getClass() == x.getClass()
will be true, but these are not absolute requirements. While it is typically the case that:
x.clone().equals(x)
will be true, this is not an absolute requirement.
按照惯例,此方法返回的对象应该 独立于此对象(正在克隆)。
在 Java 中,==
检查引用而不是对象,因此 h==h1
在您的情况下是 false
。