JDK 6 和 JDK8 在 Java Collection 上的区别

Posted

技术标签:

【中文标题】JDK 6 和 JDK8 在 Java Collection 上的区别【英文标题】:Difference in Java Collection between JDK 6 and JDK8 【发布时间】:2018-08-05 19:57:36 【问题描述】:

我想知道 java.util.collections 的实现是否在 Java 6 和 Java 8 之间发生了变化。 我有这个测试在 Java 6 中运行良好,但在 Java 8 中没有

Set<String> types = new HashSet<String>();
String result;
types.add("BLA");
types.add("TEST");

Java 6 中的结果:[BLA, TEST] Java 8 中的结果:[TEST, BLA] 我已经查看了 JDK 7 和 JDK 8 的文档和发行说明,但没有发现 JDK 6 和其他两个在这方面有任何区别。 提前感谢您的澄清。

【问题讨论】:

看看this example。它表明即使使用相同的实现版本,迭代顺序也可能不同,这取决于哈希集的历史。 【参考方案1】:

实施确实发生了变化,但谁在乎呢?您正在处理一个HashSet,该文件记录为没有可依赖的顺序。所以简单的打印,并没有做任何事情,只是显示所有元素都在那里

例如,在 java-9 中,Set#ofMap#of(新集合)没有定义顺序从运行到运行。没有定义顺序 == 不要依赖它。

【讨论】:

【参考方案2】:

您没有理由期望 JDK6 或 JDK8 中的 [BLA, TEST] 输出,因为 Javadoc 不向您保证 HashSet 的元素将根据插入顺序(或任何顺序)打印。允许不同的实现产生不同的顺序。

如果要确保两个 JDK 中的输出,请使用 LinkedHashSet,它维护插入顺序:

Set<String> types = new LinkedHashSet<String>();
String result;
types.add("BLA");
types.add("TEST");
System.out.println (types);

将打印

[BLA, TEST]

在两个版本中。

顺便说一句,Javadoc 也不保证此输出,因此可以将其视为可能在未来版本中更改的实现细节,但更改的可能性较小。这个输出的原因是AbstractCollectiontoString()(这是HashSetLinkedHashSet使用的实现)按照迭代器返回的顺序列出了元素。

字符串 java.util.AbstractCollection.toString()

返回此集合的字符串表示形式。字符串表示由集合元素的列表组成,按其迭代器返回的顺序,括在方括号(“[]”)中。相邻元素由字符“、”(逗号和空格)分隔。通过 String.valueOf(Object) 将元素转换为字符串。

【讨论】:

那么,不同版本之间的哈希逻辑是否发生了变化? @user7 我没有验证 Java 6 中的输出,但根据 OP 声明的 Java 6 输出,散列逻辑必须已更改(hashCode() 实现 String 类,或者更有可能是由HashSet/HashMap执行的二次散列)。 好的。快速浏览一下,似乎 HashMap 中的内部 hash 实用程序方法逻辑似乎已更改。

以上是关于JDK 6 和 JDK8 在 Java Collection 上的区别的主要内容,如果未能解决你的问题,请参考以下文章

JDK8安装

《Java学习笔记JDK8》学习总结

Selenium3.6.0+Firefox55+JDK8.0配置

JDK8系列之JavaScript引擎Nashorn

JDK8系列之JavaScript引擎Nashorn

JDK8系列之JavaScript引擎Nashorn