Java 8 JDK6和JDK8之间Java集合的差异

Java 8 JDK6和JDK8之间Java集合的差异,java-8,java-7,jdk6,Java 8,Java 7,Jdk6,我想知道java 6和java 8之间java.util.collections的实现是否发生了变化。 我有一个测试,它在Java6中运行良好,但在Java8中运行不好 Set<String> types = new HashSet<String>(); String result; types.add("BLA"); types.add("TEST"); Set types=newhashset(); 字符串结果; 类型。添加(“BLA”); 类型。添加(“测试”);

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

Set<String> types = new HashSet<String>();
String result;
types.add("BLA");
types.add("TEST");
Set types=newhashset();
字符串结果;
类型。添加(“BLA”);
类型。添加(“测试”);
Java 6中的结果:[BLA,TEST] Java8中的结果:[测试,BLA] 我已经查看了JDK 7和JDK 8的文档和发行说明,但没有发现JDK 6和其他两个版本在这方面有任何区别。
提前感谢您的澄清。

您没有理由期望JDK6或JDK8中的
[BLA,TEST]
输出,因为Javadoc不保证
哈希集的元素将按照插入顺序(或任何顺序)打印。不同的实现可以产生不同的顺序

如果要确保在两个JDK中都有输出,请使用一个保持插入顺序的
LinkedHashSet

Set<String> types = new LinkedHashSet<String>();
String result;
types.add("BLA");
types.add("TEST");
System.out.println (types);
在两个版本中

顺便说一句,Javadoc也不能保证这个输出,因此可以将其视为一个实现细节,在未来的版本中可能会发生更改,但不太可能发生更改。此输出的原因是
AbstractCollection
toString()
(这是
HashSet
LinkedHashSet
使用的实现)按迭代器返回的顺序列出元素

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

返回此集合的字符串表示形式。字符串表示法由集合元素的列表组成,这些元素按迭代器返回的顺序排列,并用方括号(“[]”)括起来。相邻元素由字符“,”(逗号和空格)分隔。元素按String.valueOf(对象)转换为字符串


实现确实改变了,但谁在乎呢?您正在处理一个
HashSet
,该文档没有可依赖的顺序。所以简单的打印,不是做任何事情,只是显示所有元素都在那里


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

那么,散列逻辑在版本之间是否发生了变化?@user7我没有验证Java 6中的输出,但是根据OP声称的Java 6输出,散列逻辑一定发生了变化(要么是
hashCode())
实现
String
类,或者更可能是由
HashSet
/
HashMap
)执行的二次哈希。确定。快速查看,HashMap中的内部
哈希
实用程序方法逻辑似乎已更改。请查看。它表明,即使使用相同的实现版本,迭代顺序也可能不同,这取决于哈希集的历史。
[BLA, TEST]