java jdk7与8的区别_java – HashSet与JDK 7/8的顺序和区别

这是一个两部分问题:

> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值