我有以下代码:
private static class Node {
public LinkedHashSet<String> s = new LinkedHashSet<String>();
public Node(String s) {
this.s.add(s);
}
}
public static void main(String[] args) {
LinkedHashSet<Node> set1 = new LinkedHashSet<Node>();
set1.add(new Node("foo"));
LinkedHashSet<Node> set2 = new LinkedHashSet<Node>(set1);
LinkedHashSet<String> modifyingSet = new LinkedHashSet<String>();
modifyingSet.add("modifying foo");
for(Node n : set2) {
n.s = new LinkedHashSet<String>(modifyingSet);
break;
}
if (compare(set1, set2)) {
System.out.println("Equal");
} else {
System.out.println("Not Equal");
}
return;
}
private static boolean compare(LinkedHashSet<Node> h1, LinkedHashSet<Node> h2) {
Iterator<Node> h1i = h1.iterator();
Iterator<Node> h2i = h2.iterator();
while (h1i.hasNext()) {
Node n1 = h1i.next();
Node n2 = h2i.next();
if (n1.s.size() != n2.s.size()) {
return false;
} else {
Iterator<String> it1 = n1.s.iterator();
Iterator<String> it2 = n2.s.iterator();
while (it1.hasNext()) {
String t1 = it1.next();
String t2 = it2.next();
if(!t1.equals(t2)) {
return false;
}
}
}
}
return true;
}
当我修改 set2 时,set1 也被字符串“test”和“bogus”修改。所以当我比较两组时,它们总是相等的(compare()
比较每组中的字符串是否相等)
我的问题是:
据我了解,Java是按值传递的,但似乎是按引用传递的。谁能帮我弄清楚为什么?我怎样才能将集合复制到临时集合,然后修改集合但不修改第一个集合?
我觉得我在这里错过了一些非常简单的东西。