java - Java LinkedHashSet 包含方法的问题

标签 java contains hashset

我在 LinkedHashSet 及其 contains 方法方面遇到了这个问题。 让我给你总结一下。

我有这个类 C1,它有 4 个 String 属性、其各自的 getter 和 setter 以及 eclipse 默认给出的 equals() 和 hashCode() 方法。

然后我有另一个类 C2,它有 1 个 LinkedHashSet 类型的属性,并使用 getSet() 方法来访问它。

当我创建 C1 类的 1 个实例(例如对象 c1)并将其添加到类 C2 的实例 c2 时,一切都很好......我这样做:

C1 c1 = new C1("a", "b", "c", "d");
C2 c2 = new C2();
c2.getSet().add(c1);

现在,如果我使用适当的 set 方法为 c1 的第一个属性设置不同的值,然后我尝试检查 c2.getSet() 是否包含元素 c1...但它总是返回 false。 但是对象的哈希码发生了变化,而集合中的哈希码是相同的,显然,contains 方法中的 equals 测试失败了......

有谁明白这里发生了什么吗? 有什么问题吗?等于和 HashCode()?

提前致谢, 干杯

最佳答案

当您将对象添加到哈希集(或 HashMap 或任何使用哈希来查找对象的集合)时,集合类会根据为该对象计算的哈希码将该对象放入“存储桶”中。此后,您更改了对象的某个属性,因此下次计算该对象的哈希码将有所不同。然而,该对象位于旧哈希码对应的位置/桶中。因此,当您尝试查找属性和哈希码已更改的对象时,该集合会在错误的存储桶中查找并发现它是空的。 哈希码或 equals 方法都没有问题。您在这里犯的错误是:一旦将对象放入哈希集或 HashMap 中,就不要更改用于 HashMap 计算的对象的字段。作为最佳实践,如果您知道要将 C1 放入哈希集中,请将 C1 的这些属性设为最终属性。

关于java - Java LinkedHashSet 包含方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641261/

相关文章:

algorithm - HashSet 如何提供恒定时间添加操作?

java - 使用 2 个字符串集(组合它们)

java - JPA EntityManager 未在 struts2 和 JBOSS 7.1 中初始化

java - 在antlr中制作解析树

Java - JPanel 包含点方法错误

java - 如何检查字符串是否包含不区分大小写的单词?

java - osmdroid - 更高的缩放级别?

java - JAX-RS/Jersey 如何自定义错误处理?

c# - 按未选择的列排序

java - HashMap 是在 Java 内部使用 LinkedList 还是 Array 实现的?