编辑:从Java 8及更高版本开始,以下内容不再适用。这证明您不应该依赖未记录的Java行为。
此行为是由几个单独的原因引起的:
- 整数对自己散列
- 在Java中,
HashMap
s和HashSet
s由数组备份 - 它们还使用较高的位修改哈希,以修改较低的位;如果哈希值在0..15范围内,则不会被修改
- 对象运行的存储桶取决于修改后的哈希的低位
- 在地图或集合上进行迭代时,将依次扫描内部表
因此,如果您将一些小的(<16)整数添加到hashmap / hashset中,则会发生以下情况:
- 整数
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);}
版画
153。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)