JDK 6 和 JDK8 之间的 Java 集合差异

Difference in Java Collection between JDK 6 and JDK8

我想知道 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");

Java6 中的结果:[BLA,测试] 结果 Java 8 : [TEST, BLA] 我已经查看了 JDK 7 和 JDK 8 的文档和发行说明,但没有发现 JDK 6 和其他两个关于此的区别。 预先感谢您的澄清。

您没有理由期望 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 使用的实现)按照迭代器返回的顺序列出元素。

String java.util.AbstractCollection.toString()

Returns a string representation of this collection. The string representation consists of a list of the collection's elements in the order they are returned by its iterator, enclosed in square brackets ("[]"). Adjacent elements are separated by the characters ", " (comma and space). Elements are converted to strings as by String.valueOf(Object).

实施确实发生了变化,但谁在乎呢?您正在处理一个 HashSet,它记录为没有 rely-on 的订单。所以简单地打印,没有做任何事情,只是显示所有元素都在那里

在 java-9 Set#ofMap#of(新集合)中没有定义顺序 从 run-to-run例子。没有定义命令 == 不要依赖它。