Java 来自(…)集合的随机迭代顺序

Java 来自(…)集合的随机迭代顺序,java,collections,set,iteration,Java,Collections,Set,Iteration,大家好,我正在学习Java9的新特性,并且正在阅读新集合API。我不知道为什么在从两个JDK实例创建一个不可变集时会得到随机的迭代顺序 JDK 1: jshell> Set.of("a","b","c") $96 ==> [a, b, c] JDK2 : jshell> Set.of("a","b","c") $68 ==> [a, c, b] 重载列表的情况与此不同。我是否可以进行一些自定义,如更改某些系统属性,以确保此处的顺序一致?任意

大家好,我正在学习Java9的新特性,并且正在阅读新集合API。我不知道为什么在从两个JDK实例创建一个不可变集时会得到随机的迭代顺序

JDK 1: jshell> Set.of("a","b","c")
       $96 ==> [a, b, c]

JDK2 : jshell> Set.of("a","b","c")
       $68 ==> [a, c, b]
重载列表的情况与此不同。我是否可以进行一些自定义,如更改某些系统属性,以确保此处的顺序一致?

任意集合实现都没有顺序,因此在对Set.of返回的集合元素进行迭代时遇到的任何迭代顺序都是正确的,您不应该依赖它。这是一个实现细节,不同的JDK版本可以产生不同的迭代顺序

如果您需要一致的顺序,请不要使用集合,或者使用保证顺序的集合,例如TreeSet

List.of具有不同的行为,因为列表具有顺序。在列表返回的列表中,a、b、c、a始终是第一个元素,b始终是第二个元素,c始终是第三个元素。

任意集合实现都没有顺序,因此在对Set.of返回的集合的元素进行迭代时遇到的任何迭代顺序都是正确的,您不应该依赖它。这是一个实现细节,不同的JDK版本可以产生不同的迭代顺序

如果您需要一致的顺序,请不要使用集合,或者使用保证顺序的集合,例如TreeSet

List.of具有不同的行为,因为列表具有顺序。在List.ofa,b,c返回的列表中,a始终是第一个元素,b是第二个元素,c是第三个元素。

如前所述,未指定集合的迭代顺序

为了避免其他程序依赖于迭代顺序,JVM将在启动时创建一个salt,并使用它来随机化其内部集合和映射实现的迭代顺序:

简言之:他们做了额外的工作,使迭代顺序随机,因此,如果人们开始依赖顺序,事情就会破裂

例如,有些程序确实依赖于HashSet的迭代顺序,这使得现在很难在不破坏依赖于该顺序的程序的情况下改进HashSet。

如前所述,没有指定集合的迭代顺序

为了避免其他程序依赖于迭代顺序,JVM将在启动时创建一个salt,并使用它来随机化其内部集合和映射实现的迭代顺序:

简言之:他们做了额外的工作,使迭代顺序随机,因此,如果人们开始依赖顺序,事情就会破裂


例如,有些程序确实依赖于HashSet的迭代顺序,这使得现在很难在不破坏依赖于该顺序的程序的情况下改进HashSet。

让我们在下一次VM运行中破坏它,而我们保留在未来版本中破坏它的权利的好处是:历史表明,第二个没有受到重视,并且因此不起作用。让我们在下一次虚拟机运行中打破它,与我们保留在未来版本中打破它的权利相比,其好处是:历史表明,第二个版本没有受到重视,因此不起作用。您是否正在尝试寻找替代方案?可能已经解释过了,你是不是想找一个?而且可能已经解释了这一点。
/**
 * A "salt" value used for randomizing iteration order. This is initialized once
 * and stays constant for the lifetime of the JVM. It need not be truly random, but
 * it needs to vary sufficiently from one run to the next so that iteration order
 * will vary between JVM runs.
 */
private static final long SALT32L;