gpt4 book ai didi

java - LinkedHashSet 修改集

转载 作者:行者123 更新时间:2023-11-29 08:01:59 26 4
gpt4 key购买 nike

我有以下代码:

  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是按值传递的,但好像是按引用传递的。谁能帮我弄清楚为什么?我怎样才能将集合复制到临时集合,然后修改集合而不修改第一个集合?

我觉得我在这里遗漏了一些非常简单的东西。

最佳答案

这里有很多问题和误解,所以这里有一个列表。

a) 你不能修改 Set 的元素并期望它仍然有效。 Javadoc for Set 更具体:

Note: Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is an element in the set. A special case of this prohibition is that it is not permissible for a set to contain itself as an element.

总是假设“未指定的行为”转化为“它在你的脸上爆炸”,或者“它只在周二阿尔伯克基下雨时起作用,所以它可能有一半时间起作用,而另一半时间可能会爆炸。”

b) 您必须覆盖 hashCode()equals(Object)HashSet 中使用对象或 LinkedHashSet , 如果您不想将它们与 == 进行比较,看起来您可能不应该在此应用程序中使用它。

c) Java 按值传递引用,这不同于按值传递按引用传递。特别是,修改一个对象会影响对同一对象的所有引用,但将引用更改为引用不同的对象不会影响其他引用。

Set<Foo> set1 = new LinkedHashSet<Foo>();
Set<Foo> set2 = set1;
Set<Foo> set3 = set1;
set1.add(new Foo());
// set1, set2, and set3 each refer to the same Set, which now contains one Foo
set3 = new LinkedHashSet<Foo>();
// set1 and set2 still refer to the Set with one Foo;
// set3 now refers to a new empty Set

d) 复制 LinkedHashSet , 就做 new LinkedHashSet<Foo>(setToCopy) .

关于java - LinkedHashSet 修改集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com