在服务器停止之前,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 所说,始终是确定性的。
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 所说,始终是确定性的。