在服务器停止之前,HashSet 的随机顺序始终相同

Random order of a HashSet is always same until Server stopped

HashSet 不维护其 elements.I 将我的应用程序部署到 jBoss 服务器的顺序,我正在观察 HashSet 的顺序。 这是随机的。

但总是有相同的随机顺序直到我重新启动我的应用程序服务器。 任何人都可以用底层机制来解释这种情况吗?

我正在研究一个与 HashSet<Object> 的元素顺序相关的问题。

我们的一些服务器始终保持正确的顺序(仍然是随机的),而另一些则没有。重启后,我明白了。

HashSet不保证其中元素的顺序,但这并不意味着顺序会随机变化。只有当需要重新计算哈希值时,元素的顺序才会改变,并且只有当底层哈希值 table 的容量需要改变时才会发生这种情况。

Hash的容量何时变化的具体细节在不同的实现之间可能会有所不同,但是可以保证如果HashSet中的元素个数除以HashSet的容量超过其loadFactor, HashSet 的容量会增加。每当容量增加时,所有元素的哈希码都会重新计算,因此元素的顺序可能会发生变化。

如您所说,您没有覆盖 hashcode 方法,您使用的是 Object class 中的默认值。 javadoc 说:在相当实用的情况下,class Object 定义的 hashCode 方法为不同的对象执行 return 不同的整数。 (这通常是通过将对象的内部地址转换为整数来实现的,但是JavaTM编程语言不需要这种实现技术。)

这意味着(假设您使用的是 Oracle JVM 或类似的),对象的哈希码将只是它们的内存地址。这对于程序 运行 是固定的,但对于不同的 运行,它们肯定会有所不同,具体取决于程序的加载位置。由于散列函数 不是 单调的,因此 HashSet 中的顺序将不同(但如 Oliver Charlesworth 所说,始终是确定性的。