为什么不从套装中删除?

4 java puzzle

这个bug花了我一段时间才发现......

考虑这种方法:

public void foo(Set<Object> set)
{
    Object obj=set.iterator().next();
    set.remove(obj)
}
Run Code Online (Sandbox Code Playgroud)

我使用非空哈希集调用该方法,但不会删除任何元素!

那为什么会这样?

Adr*_*onk 7

对于HashSet,如果对象的hashCode在添加到集合后发生更改,则会发生这种情况.然后HashSet.remove()方法可能会查找错误的Hash存储桶而无法找到它.

如果你做了iterator.remove(),这可能不会发生,但无论如何,将对象存储在hashCode可以改变的HashSet中是一个等待发生的事故(如你所发现的).

  • 只是尝试将 remove 用于在添加后更改其哈希码的对象,并且删除确实失败。顺便说一句,iterator.remove() 也是如此。 (2认同)