"包含"ArrayList与HashSet的实现

fan*_*ncy 4 java collections contains equals hashcode

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

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

如果我称它为hashSet.contains(fooInstance)返回仍然false.

它变得非常奇怪的是以下行返回true:

new ArrayList<Foo>(hashSet).contains(fooInstance)
Run Code Online (Sandbox Code Playgroud)

遗憾的是,事实证明,.contains()实现的差异究竟在哪里,比预期更难.但我想我会是安全的,因为.equals().hashCode()做工精细.

Joa*_*uer 9

最可能的原因是认为hashCodeFoo不稳定和返回值hashCode()的的Foo变化情况后,它被添加到HashSet.理想情况下,您只需要将不可变对象添加到HashSet.

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