[英]“Contains” implementation of ArrayList vs HashSet
我有一个HashSet<Foo>
。 我有一个对象
如果我调用hashSet.contains(fooInstance)
它仍返回false
。
真正奇怪的是,以下行返回true
:
new ArrayList<Foo>(hashSet).contains(fooInstance)
可悲的是,事实证明找出.contains()
实现的差异.contains()
里比预期更难。 但我认为我会安全,因为.equals()
和.hashCode()
工作正常。
最可能的原因是Foo
的hashCode
不稳定,并且Foo
实例的hashCode()
的返回值在添加到HashSet
后发生了更改。 理想情况下,您只需要将不可变对象添加到HashSet
。
出于性能原因, HashSet
将计算出的hashCode
存储在其条目中,因此不需要为每个get
重新计算它。 因此,如果对象在HashSet
内部发生更改,则无法实现,并且您的对象将在HashSet
有效地“丢失”(您仍然可以通过迭代所有元素来获取它,这实质上是复制到ArrayList
中的所有元素)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.