Java 8 JDK6和JDK8之间Java集合的差异
我想知道java 6和java 8之间java.util.collections的实现是否发生了变化。 我有一个测试,它在Java6中运行良好,但在Java8中运行不好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”); 类型。添加(“测试”);
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]