java – HashSet与JDK 7/8的顺序和区别
这是一个两部分问题:
> HashSet是否实现了一些隐藏的排序机制,或者只是引用文档:它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变.告诉我,未来有时可能会改变订单和/或取决于内存使用情况? 举个例子: 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的更新
所以,基本上 用于散列集合的算法已更改以提高性能.它变为平衡树而不是链表. 这种更改可能会改变您的集合的迭代顺序,并且已确定您应该修复此类行为,如果您依赖它. 你看到了一个更好的集合实现,它可能看起来像是有序的,但它纯属巧合. 我建议你不要依赖集的迭代顺序,因为顺序不是保证. @编辑 如用户Holger所述,另一个概念也很重要,
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |