次のコードがあります。
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は値渡しですが、参照渡しだったようです。誰かが理由を理解するのを手伝ってくれますか? また、セットを一時セットにコピーし、セットを変更して最初のセットを変更しないようにするにはどうすればよいですか?
ここで非常に単純なものが欠けているように感じます。