- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
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/
我有很多不同类型的对象的LinkedHashSets要从一个java类传递到另一个类,我是否将它们打包到一个更大的对象中(如果可能的话,另一个链接哈希集)或者我只是将它们传递到正常的对象中方式作为参数
有没有一种方法可以对 LinkedHashSet 中的链接进行排序?我知道它保留了添加元素的顺序,但是有没有一种方法可以像链表一样重新排序这些链接,并使其仍然表现出 HashMap 行为? 最佳答案
现有的功能除了保留插入顺序之外,还使用 LinkedHashSet 来存储一组唯一元素。 有一个新要求,要求检索 LinkedHashSet 中已存在的特定元素。即,当尝试添加元素时,该方法应检查
我找到了 3-4 个关于该主题的主题,但它们没有任何帮助,因为我已经尝试了那里的人建议主题开启者的任何内容。它已经在我的代码中了。 // Set the images of users that ow
这个问题已经有答案了: Is there a Collector that collects to an order-preserving Set? (1 个回答) 已关闭 5 年前。 我想以自然顺序
我有一个声明如下的集合 Set orderSet = new LinkedHashSet (); 存储的字符串值是日期和时间约定的组合 orderSet.add(bean.getDate()+","
我一直在将一大块 Java 代码移植到 C++,并且在我离开时不得不实现 LinkedHashSet 之类的东西。我已经使用 Boost 的多索引容器对 LinkedHashSet/Map 进行了合理
我目前正在构建一个 Android 应用程序,在其中显示名人的名言。我有一个主屏幕和另外两个屏幕,其中我显示所有引言,另一个屏幕显示我最喜欢的引言。 因此,当我在 AllQuotesActivity
有 Collections.unmodifiableCollection() 和 Collections.unmodifiableSet() 但没有 Collections.unmodifiableL
我有以下代码: private static class Node { public LinkedHashSet s = new LinkedHashSet(); public N
我正在解决一个问题,我需要存储具有无重复和维护顺序要求的元素。我选择使用 LinkedHashSet 因为它满足了我的两个要求。 假设我有这段代码: LinkedHashSet hs = new L
我正在尝试创建一种搜索算法,将坐标对存储在名为 HashSquareSpec 的包装类中。为了避免重复并保持插入顺序,我将每个 HashSquareSpec 插入到 LinkedHashSet 中。即
LinkedHashSet lHs = new LinkedHashSet(); lHs.add("Beta"); 在编译上面的代码时(tutorialspoint 使用了类似的方法),我得到了错误:
我很好奇是否有人知道为什么我的 LinkHashSet 中的第一个元素似乎允许重复?我正在通过 CodeEval 进行代码挑战,当我输入值 2、2、3、3、3、4、4、4、5、5、6 时,程序的输出显
我有两组 LinkedHashSet 对象,在这个对象中我有其他对象有更多 LinkedHashSet。 我的问题是: equals 方法(默认)是否检查所有内部 HashSets 是否相同?还是我必
构造函数LinkedHashSet(Collection c)假设参数是有序集合,保证其参数的保留顺序?我们如何确定这一点? Javadoc 文档没有说明顺序: Constructs a new li
我有一个简单的问题要问你,我的 Product 类有这样的字段: private Integer id; private String category; private String symbol;
我想存储一个数字列表 1,2,3,4 -(让我们从 List 开始) 我想确保数字是唯一的(好的,很好,Set) 我想保证订单(好的... LinkedHashSet) 我想从列表中获取最后一个元素.
如何遍历 LinkedHashSet 从最后一项到第一项? 最佳答案 如果您想继续使用集合,可以使用以下方法: LinkedHashSet set = ... LinkedList list = ne
我有一个 XML 文件,我需要在其中查找并计算年份标签的出现次数。例如: Found year 2020 10 times. Found year 2017 1 times. Found year 2
我是一名优秀的程序员,十分优秀!