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
中的相应元素也将发生改变,因为两者都引用同一个对象。
例如,这将影响两个 Set
s :
for(Name name: nameTreeSet) {
if(name.getName().equals("aristotle"))
name.setName("new name");
}
但是,克隆的 TreeSet
是与原始 TreeSet
不同的对象,并且从一个对象中删除元素不会影响另一个对象。从一个 Set
中删除元素只会影响另一个 Set
只有当您不克隆而只是复制引用时 - TreeSet<Name> cloneNameTreeSet = nameTreeSet;
.
我有疑问,我想检查 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
中的相应元素也将发生改变,因为两者都引用同一个对象。
例如,这将影响两个 Set
s :
for(Name name: nameTreeSet) {
if(name.getName().equals("aristotle"))
name.setName("new name");
}
但是,克隆的 TreeSet
是与原始 TreeSet
不同的对象,并且从一个对象中删除元素不会影响另一个对象。从一个 Set
中删除元素只会影响另一个 Set
只有当您不克隆而只是复制引用时 - TreeSet<Name> cloneNameTreeSet = nameTreeSet;
.