这个bug花了我一段时间才发现......
考虑这种方法:
public void foo(Set<Object> set)
{
Object obj=set.iterator().next();
set.remove(obj)
}
Run Code Online (Sandbox Code Playgroud)
我使用非空哈希集调用该方法,但不会删除任何元素!
那为什么会这样?
对于HashSet,如果对象的hashCode在添加到集合后发生更改,则会发生这种情况.然后HashSet.remove()方法可能会查找错误的Hash存储桶而无法找到它.
如果你做了iterator.remove(),这可能不会发生,但无论如何,将对象存储在hashCode可以改变的HashSet中是一个等待发生的事故(如你所发现的).
| 归档时间: |
|
| 查看次数: |
5413 次 |
| 最近记录: |