本文介绍了这个HashSet如何产生排序输出?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下代码生成输出 [1,2]
,即使hashset未排序。
The following code produces the out put [1,2]
even though hashset is not sorted.
Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
为什么会这样?
推荐答案
此行为是由以下几个原因造成的:
This behaviour is caused by several separate reasons:
- 整数哈希自己
- 在Java中,
HashMap
s和HashSet
由数组备份 - 他们还使用较高位修改哈希值来修改低位;如果散列在0..15的范围内,则不会被修改
- 对象的内容取决于修改散列的低位
- 当迭代地图或集合时,内部表将按顺序扫描
- Integers hash to themselves
- in Java,
HashMap
s andHashSet
s are backed up by an array - they also modify hashes using the higher bits to modify the lower bits; if the hash is in range 0..15, it's therefore not modified
- what bucket an object goes depends on the lower bits of the modified hash
- when iterating over a map or a set, the inner table is scanned sequentially
因此,如果添加几个小(
So if you add several small (<16) integers to a hashmap/hashset, this is what happens:
- 整数
i
有hashcodei
- 因为它小于16,所以修改后的散列也是
i
- 它落在桶中。
i
- 在迭代时,会按顺序访问存储桶,因此如果存储的所有数据都是小整数,则会以升序检索它们订单
- integer
i
has hashcodei
- since it's less than 16, it's modified hash is also
i
- it lands in the bucket no.
i
- when iterating, the buckets are visited sequentially, so if all you stored there are small integers, they will be retrieved in ascending order
请注意,如果存储桶的初始数量太小,整数可能会落在以后编号的存储桶中:
Note that if the initial number of buckets is too small, the integers may land in buckets not numbered after them:
HashSet<Integer> set = new HashSet<>(4);
set.add(5); set.add(3); set.add(1);
for(int i : set) {
System.out.print(i);
}
打印 153
。
这篇关于这个HashSet如何产生排序输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!