繁体   English   中英

来自 Set.of(...) 的随机迭代顺序

[英]Random Iteration order from Set.of(…)

嗨,我正在学习 Java 9 的新功能,并且正在阅读新的 Collections 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]

对于 List.of() 重载,我看不到相同的内容。我可以进行一些自定义,例如更改某些系统属性以保证此处的顺序一致吗?

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

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

List.of()具有不同的行为,因为List具有排序。 List.of("a","b","c")返回的List中,“a”始终是第一个元素,“b”是第二个元素,“c”是第三个元素。

正如Eran已经解释的那样,没有指定Set的迭代顺序。

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

 /** * 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;

资源

简而言之:他们做了额外的工作来使迭代顺序“随机”,所以如果人们开始依赖这个顺序,事情就会中断。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM