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#of
和 Map#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 也不保证此输出,因此可以将其视为可能在未来版本中更改的实现细节,但更改的可能性较小。这个输出的原因是AbstractCollection
的toString()
(这是HashSet
和LinkedHashSet
使用的实现)按照迭代器返回的顺序列出了元素。
字符串 java.util.AbstractCollection.toString()
返回此集合的字符串表示形式。字符串表示由集合元素的列表组成,按其迭代器返回的顺序,括在方括号(“[]”)中。相邻元素由字符“、”(逗号和空格)分隔。通过 String.valueOf(Object) 将元素转换为字符串。
【讨论】:
那么,不同版本之间的哈希逻辑是否发生了变化? @user7 我没有验证 Java 6 中的输出,但根据 OP 声明的 Java 6 输出,散列逻辑必须已更改(hashCode()
实现 String
类,或者更有可能是由HashSet
/HashMap
执行的二次散列)。
好的。快速浏览一下,似乎 HashMap 中的内部 hash
实用程序方法逻辑似乎已更改。以上是关于JDK 6 和 JDK8 在 Java Collection 上的区别的主要内容,如果未能解决你的问题,请参考以下文章