4

我想知道 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 和两者之间有任何区别其他与此有关的。提前感谢您的澄清。

4

2 回答 2

5

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

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

于 2018-02-26T11:15:58.087 回答
4

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

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

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

将打印

[BLA, TEST]

在两个版本中。

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

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

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

于 2018-02-26T11:15:18.157 回答