我在 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/