当前位置: 首页 > 面试题库 >

这个HashSet如何产生排序的输出?

鲍飞星
2023-03-14
问题内容

[1,2]即使未对哈希集进行排序,以下代码也会产生输出。

Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);

这是为什么?


问题答案:

编辑:从Java 8及更高版本开始,以下内容不再适用。这证明您不应该依赖未记录的Java行为。

此行为是由几个单独的原因引起的:

  • 整数对自己散列
  • 在Java中,HashMaps和HashSets由数组备份
  • 它们还使用较高的位修改哈希,以修改较低的位;如果哈希值在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



 类似资料:
  • 问题内容: This is the CSS: How does it produce the circle below? 假设,如果矩形的宽度为180像素,高度为180像素,则它将矩形变得越来越小,也就是说,如果半径大小增加,矩形几乎会消失。 那么,如何将180像素的边界height/width-> 0px变成半径为180像素的圆? 问题答案: 高度/宽度-> 0px的180像素边框如何变成半径为

  • 我用C#做了一个快速排序算法,当数组中只有10个项时,它可以工作。当我增加这个数字时,它就会陷入无限循环。这是问题所在的代码: 当调用sortArray时,left=0,right=49&array是一个随机的50个元素的一维数组。 您可以忽略对reDrawer和refresher的引用,因为这些不会影响排序算法,它们只会在图片框中绘制结果。

  • 问题内容: 我正在尝试创建一个HashSet(或任何集合类型- 但我认为HashSet最适合我),无论插入什么,它都将保持顺序。这是我正在从事的联系人管理器项目。我一直在尝试以下示例。 我希望输出将名称按字母顺序排列-至少根据其名字或姓氏。但是,我什至无法辨别用于此排序的HashSet方法。 我的问题是,如何告诉程序如何根据规范对名称进行排序? 问题答案: HashSet不会为条目提供任何有意义的

  • 最近,我在尝试使用和对自引用列表进行排序时遇到了一个奇怪的差异。我希望有人能弄清楚这件事。有关守则如下:

  • 问题内容: 范例1: 输出为: 范例2: 输出: 我只是不明白为什么将saySomething设为非静态会导致第二次调用saySomething调用Cow版本而不是Animal版本。我的理解是, 这两种情况都是输出。 问题答案: 静态方法在编译时绑定到其类,并且不能多态使用。在Animal上声明“静态”方法时,该方法永远绑定到Animal类,并且不能被覆盖。静态方法绑定到Class对象,而不是Cl