【发布时间】:2011-02-11 20:57:33
【问题描述】:
如果添加到 java.util.HashSet 的每个对象都以确定性方式实现 Object.equals() 和 Object.hashCode(),那么对于添加的每组相同的元素,HashSet 上的迭代顺序是否保证相同, 无论它们的添加顺序如何?
额外问题:如果插入顺序也相同怎么办?
(假设 Sun JDK6 具有相同的 HashSet 初始化。)
编辑:我最初的问题不清楚。这不是关于 HashSet 的一般合同,而是 Sun 在 JDK6 中的 HashSet 实现提供了关于确定性的保证。它本质上是非确定性的吗?是什么影响了它的迭代器使用的顺序?
【问题讨论】:
-
我认为 Michael Borgwardt 指出了这一点:插入顺序会影响碰撞行为。 Péter Török 关于初始化(例如大小和负载因子)的观点也很重要。除此之外,它将是确定性的。相同的 JVM,相同的初始化,相同的顺序?它怎么可能不是确定性的?我查看了 JDK6 代码,它显然是确定性的 - 没有使用 Math.random() !!!
-
可以编写使用 Math.random() 的确定性程序。对于不使用 Math.random() 的非确定性程序也是如此。
标签: java algorithm collections hashset