加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 05:14:33 所属栏目:Java 来源:网络整理
导读:这是一个两部分问题: HashSet是否实现了一些隐藏的排序机制,或者只是引用文档:它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变.告诉我,未来有时可能会改变订单和/或取决于内存使用情况? 当我在JDK之间切换时,为什么我会完全不同’
这是一个两部分问题:

> HashSet是否实现了一些隐藏的排序机制,或者只是引用文档:它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变.告诉我,未来有时可能会改变订单和/或取决于内存使用情况?
>当我在JDK之间切换时,为什么我会完全不同’订购'(我敢说)?

举个例子:

for (int i = 0; i < 1000; i++) {
        Set<String> 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:[,asdxasd]

显然,空字符串和仅空白字符串两次都是引导方式,但其余部分完全不同.

解决方法

根据收集 changes page的更新

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读