这是一个两部分问题:
> HashSet是否实现了一些隐藏的排序机制,或者只是引用文档:它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变.告诉我,未来有时可能会改变订单和/或取决于内存使用情况?
>当我在JDK之间切换时,为什么我会完全不同’订购'(我敢说)?
举个例子:
for (int i = 0; i < 1000; i ) {
Set stringSet = new HashSet<>();
stringSet.add("qwe");
stringSet.add("rtz");
stringSet.add("123");
stringSet.add("qwea");
stringSet.add("12334rasefasd");
stringSet.add("asdxasd");
stringSet.add("arfskt6734");
stringSet.add("123121");
stringSet.add("");
stringSet.add("qwr");
stringSet.add("rtzz");
stringSet.add("1234");
stringSet.add("qwes");
stringSet.add("1234rasefasd");
stringSet.add("asdxasdq");
stringSet.add("arfskt6743");
stringSet.add("123121 ");
stringSet.add(" ");
System.out.println(stringSet);
}
无论我运行多少次,都会产生以下输出:
JDK 7:[,, 123,qwea,asdxasdq,qwe,qwr,123121,arfskt6743,1234rasefasd,qwes,rtz,rtzz,1234,12334rasefasd,asdxasd,arfskt6734,123121]
JDK 8:[,, qwes,arfskt6743,asdxasdq,123121,123121,arfskt6734,qwr,123,1234,qwea,rtzz,rtz,12334rasefasd,1234rasefasd,qwe,asdxasd]
显然,空字符串和仅空白字符串两次都是引导方式,但其余部分完全不同.
解决方法:
The alternative String hash function added in 7u6 has been removed from JDK 8, along with the jdk.map.althashing.threshold system property. Instead, hash bins containing a large number of colliding keys improve performance by storing their entries in a balanced tree instead of a linked list. This JDK 8 change applies only to HashMap, LinkedHashMap, and ConcurrentHashMap.
In rare situations, this change could introduce a change to the iteration order of HashMap and HashSet. A particular iteration order is not specified for HashMap objects – any code that depends on iteration order should be fixed.
所以,基本上
用于散列集合的算法已更改以提高性能.它变为平衡树而不是链表.
这种更改可能会改变您的集合的迭代顺序,并且已确定您应该修复此类行为,如果您依赖它.
你看到了一个更好的集合实现,它可能看起来像是有序的,但它纯属巧合.
我建议你不要依赖集的迭代顺序,因为顺序不是保证.
@编辑
如用户Holger所述,另一个概念也很重要,
The “alternative String hash function” of Java 7 was not used by default. Further, the balanced tree only applies to bucket collision scenarios. Still, as a consequence of this improvement, another, unmentioned change has been made. The mapping of an object’s hashcode to an array position undergoes a transformation which has been simplified from Java 7 to Java 8
来源:https://www.icode9.com/content-1-326151.html