4

我有一个HashSet<Foo>. 我有一个对象是

  1. 等于集合的一个元素,并且
  2. 具有与实现的同一对象匹配的哈希码。

如果我称之为hashSet.contains(fooInstance)返回false

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

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

可悲的是,要找出实施的差异到底在哪里,结果比预期的要难.contains()。但我认为我会很安全,因为.equals()并且.hashCode()工作正常。

4

1 回答 1

9

最可能的原因是hashCodeofFoo不稳定,实例的返回hashCode()Foo添加HashSet. 理想情况下,您只会将不可变对象添加到HashSet.

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

于 2013-09-17T11:40:42.160 回答