我有个疑问,我想检查一下java中的TreeSet是否真的为它的clone()使用了浅拷贝,但是如果我从父树set中移除了一个元素,那么它不会反映在它的克隆的treeset对象中。Treeset的clone()的证明在java中创建浅拷贝?
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);
}
}
请给我建议,更正非常感谢:) – Arafath
为什么你会期望一个元素被从克隆的实例中删除,如果你从原来的删除它? 'clone()'创建一个单独的实例,具有单独的状态,因此原始中的更改不会反映在克隆中(反之亦然) –
浅拷贝仍然是副本:您可以更改一个,而不会影响另一个。 – khelwood