我有HashSet<Foo>
。
我有一个对象
如果我致电hashSet.contains(fooInstance)
,它仍会返回false
。
真正奇怪的是,以下行返回true
:
new ArrayList<Foo>(hashSet).contains(fooInstance)
可悲的是,事实证明找出.contains()
实施的确切区别在哪里比预期更难。
但我认为我会安全,因为.equals()
和.hashCode()
工作正常。
答案 0 :(得分:9)
最可能的原因是hashCode
的{{1}}不稳定,Foo
实例的hashCode()
的返回值在>之后> em>它被添加到Foo
。理想情况下,您只需将不可变对象添加到HashSet
。
出于性能原因,HashSet
将计算出的HashSet
存储在其条目中,因此不需要为每个hashCode
重新计算它。因此,如果对象在get
内部发生变化,这将无法实现,并且您的对象将在HashSet
中有效地“丢失”(您仍然可以通过遍历所有元素来获取它,本质上是复制到HashSet
的内容。