Treeset 的 clone() 证明在 java 中创建了浅拷贝?

Proof of Treeset's clone() creates shallow copy in java?

我有疑问,我想检查 java 中的 TreeSet 是否真的为其 clone() 使用浅拷贝,但根据我的程序,如果我从父树集中删除一个元素,它不会反映在它的克隆树集对象。

public class TreeSetExample {
    public static void main(String[] args) {
        TreeSet<Name> nameTreeSet = new TreeSet<>();
        nameTreeSet.add(new Name("Compiere"));
        nameTreeSet.add(new Name("Aristotle"));
        nameTreeSet.add(new Name("CompierE"));
        nameTreeSet.add(new Name("COmpiere"));
        nameTreeSet.add(new Name("ArisTotle"));
        nameTreeSet.add(new Name("arisTotle"));
        nameTreeSet.add(new Name("aristotle"));
        System.out.println(nameTreeSet);

        TreeSet<Name> cloneNameTreeSet = (TreeSet<Name>) nameTreeSet.clone();
        System.out.println(nameTreeSet);
        Iterator<Name> itr = nameTreeSet.iterator();

        /*while (itr.hasNext()) {
            if (itr.next().getName().equals("aristotle"))
                itr.remove();
        }*/

        for(Name name: nameTreeSet) {
            if(name.getName().equals("aristotle"))
                nameTreeSet.remove(name);
        }

        System.out.println(nameTreeSet);
        System.out.println(cloneNameTreeSet);
    }
}

/*
*Name class which is used in my treeset to store its objects
*/

public class Name implements Cloneable, Comparable<Name>, Comparator<Name> {
    @Override
    public String toString() {
        return "Name [name=" + name + "]";
    }

    private String name;

    public Name(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Name other = (Name) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public int compare(Name name1, Name name2) {
        return name1.name.compareTo(name2.name);
    }

    @Override
    public int compareTo(Name name) {
        return (this.name).compareTo(name.name);
    }

}

if I remove a element from parent treeset, its not reflecting in its cloned treeset object.

你误解了浅拷贝的意思。这意味着对于 TreeSet 的每个元素,引用都被复制到新的 TreeSet。因此,如果您改变位于一个 Set 中的 Name 对象之一,另一个 Set 中的相应元素也将发生改变,因为两者都引用同一个对象。

例如,这将影响两个 Sets :

    for(Name name: nameTreeSet) {
        if(name.getName().equals("aristotle"))
            name.setName("new name");
    }

但是,克隆的 TreeSet 是与原始 TreeSet 不同的对象,并且从一个对象中删除元素不会影响另一个对象。从一个 Set 中删除元素只会影响另一个 Set 只有当您不克隆而只是复制引用时 - TreeSet<Name> cloneNameTreeSet = nameTreeSet;.