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