以下代码产生输出[1,2]
即使哈希集没有排序。
Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
这是为什么?
编辑:从 Java 8 及更高版本开始,以下内容不再适用。这证明您不应该依赖未记录的 Java 行为。
此行为是由几个不同的原因引起的:
- 整数散列到自己
- 在爪哇语中,
HashMap
s and HashSet
s 由数组备份
- 他们还使用较高位修改哈希值来修改较低位;如果哈希值在 0..15 范围内,则不会被修改
- 对象进入哪个存储桶取决于修改后的哈希值的低位
- 当迭代映射或集合时,按顺序扫描内表
因此,如果将几个小(
- integer
i
有哈希码i
- 由于它小于 16,因此修改后的哈希值也是
i
- 它落在桶中。
i
- 迭代时,按顺序访问存储桶,因此如果您存储的所有内容都是小整数,则会按升序检索它们
请注意,如果存储桶的初始数量太小,则整数可能会落在后面没有编号的存储桶中:
HashSet<Integer> set = new HashSet<>(4);
set.add(5); set.add(3); set.add(1);
for(int i : set) {
System.out.print(i);
}
prints 153
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)