Java LinkedHashSet上的问题包含方法

时间:2013-10-28 17:29:03

标签: java contains hashset

我遇到了LinkedHashSet及其contains方法的问题。 让我总结一下。

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

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

当我创建一个C1类的实例(比如对象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测试失败了......

有谁知道这里发生了什么? 有什么不对? Equals和HashCode()?

提前致谢, 欢呼声

2 个答案:

答案 0 :(得分:2)

将对象添加到哈希集(或哈希映射或使用哈希查找对象的任何集合)时,集合类会根据为对象计算的哈希码将对象放入“桶”。在此之后,您将更改对象的属性,因此下次计算时对象的哈希码将不同。但是,对象位于与旧哈希码对应的位置/桶中。因此,当您尝试使用更改的属性和哈希码查找对象时,该集将查找错误的存储桶并将其查找为空。 散列码或equals方法没有任何问题。你在这里犯的错误是:一旦将对象放入哈希集或哈希映射中,就不要更改在哈希映射计算中使用的对象的字段。作为最佳实践,如果您知道将把它放入哈希集中,请将C1的这些属性作为final。

答案 1 :(得分:0)

LinkedHashSet集合不会遵循您的内部修改。 通过更改c1内容,我认为您更改了对象的hashCode。 因此,当您调用contains时,LinkedHashSet无法检索它。