Java 在服务器停止之前,哈希集的随机顺序始终相同

Java 在服务器停止之前,哈希集的随机顺序始终相同,java,hashset,Java,Hashset,HashSet不维护其元素的顺序。我将我的应用程序部署到了jBoss服务器,并且我遵守了HashSet的顺序。 这是随机的。 但在我重新启动应用程序服务器之前,总是有相同的随机顺序。 有人能用潜在的机制来解释这种情况吗 我正在深入研究一个与HashSet元素顺序相关的问题 我们的一些服务器始终保持正确的顺序(仍然是随机的),而一些服务器则没有。重新启动后,我发现了这一点。HashSet不能保证其中元素的顺序,但这并不意味着顺序将随机更改。只有当需要重新计算哈希时,元素的顺序才会改变,并且只有当底

HashSet
不维护其元素的顺序。我将我的应用程序部署到了
jBoss
服务器,并且我遵守了
HashSet
的顺序。 这是随机的。

但在我重新启动应用程序服务器之前,总是有相同的随机顺序。
有人能用潜在的机制来解释这种情况吗

我正在深入研究一个与
HashSet
元素顺序相关的问题


我们的一些服务器始终保持正确的顺序(仍然是随机的),而一些服务器则没有。重新启动后,我发现了这一点。

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


在不同的实现中,哈希容量变化的具体时间可能有所不同,但可以保证,如果哈希集中的元素数除以哈希集的容量超过其
加载因子
,哈希集的容量将增加。每当容量增加时,都会重新计算所有元素的哈希码,因此元素的顺序可能会改变

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


在不同的实现中,哈希容量变化的具体时间可能有所不同,但可以保证,如果哈希集中的元素数除以哈希集的容量超过其
加载因子
,哈希集的容量将增加。每当容量增加时,都会重新计算所有元素的哈希码,因此元素的顺序可能会改变

正如您所说,您没有重写
hashcode
方法,您使用的是
Object
类的默认值。javadoc说:只要合理可行,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。)


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

正如您所说,您没有覆盖
hashcode
方法,您使用的是
Object
类的默认值。javadoc说:只要合理可行,class Object定义的hashcode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。)


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

答案取决于存储在HashSet中的元素类型及其类的hashCode实现。顺序不是随机的,完全是确定性的。但是,除非知道HashSet的内部代码,否则它是不可预测的。它是HashSet。是否覆盖hashCode和对象的相等方法?还是使用java.util.*中的java对象?我没有重写任何方法。我只是使用默认实现。存储的是;objects=pojot答案取决于存储在HashSet中的元素类型及其类的hashCode实现。顺序不是随机的,而是随机的完全确定的。但是,除非您知道HashSet的内部代码,否则它是不可预测的。它是HashSet。您是否覆盖对象的hashCode和相等方法?还是使用java.util.*中的java对象?我没有覆盖任何方法。我只是使用默认实现。存储的是;objects=POJOGreat!。Appr如果你能为未来的读者详细阐述,请欣赏。你所说的“详细阐述”是什么意思?你的问题的哪一部分不清楚?潜在的机制?我又增加了一段-希望现在更清楚。如果你能为未来的读者详细阐述,请欣赏。你所说的“详细阐述”是什么意思你的问题的哪一部分不清楚?潜在的机制?我又增加了一段-希望现在更清楚哈希代码已经很久没有成为内存地址了。哈希代码已经很久没有成为内存地址了。