繁体   English   中英

“包含”ArrayList与HashSet的实现

[英]“Contains” implementation of ArrayList vs HashSet

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

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

如果我调用hashSet.contains(fooInstance)它仍返回false

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

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

可悲的是,事实证明找出.contains()实现的差异.contains()里比预期更难。 但我认为我会安全,因为.equals().hashCode()工作正常。

最可能的原因是FoohashCode不稳定,并且Foo实例的hashCode()的返回值在添加到HashSet 发生了更改。 理想情况下,您只需要将不可变对象添加到HashSet

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM