“包含”ArrayList与HashSet的实现

时间:2013-09-17 11:36:49

标签: java collections equals contains hashcode

我有HashSet<Foo>。 我有一个对象

  1. 等于集合的元素和
  2. 具有与实现的同一对象匹配的哈希码。
  3. 如果我致电hashSet.contains(fooInstance),它仍会返回false

    真正奇怪的是,以下行返回true

    new ArrayList<Foo>(hashSet).contains(fooInstance)
    

    可悲的是,事实证明找出.contains()实施的确切区别在哪里比预期更难。 但我认为我会安全,因为.equals().hashCode()工作正常。

1 个答案:

答案 0 :(得分:9)

最可能的原因是hashCode的{​​{1}}不稳定,Foo实例的hashCode()的返回值在之后 em>它被添加到Foo。理想情况下,您只需将不可变对象添加到HashSet

出于性能原因,HashSet将计算出的HashSet存储在其条目中,因此不需要为每个hashCode重新计算它。因此,如果对象在get内部发生变化,这将无法实现,并且您的对象将在HashSet中有效地“丢失”(您仍然可以通过遍历所有元素来获取它,本质上是复制到HashSet的内容。