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

2024-01-04

以下代码产生输出[1,2]即使哈希集没有排序。

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

这是为什么?


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


此行为是由几个不同的原因引起的:

  • 整数散列到自己
  • 在爪哇语中,HashMaps and HashSets 由数组备份
  • 他们还使用较高位修改哈希值来修改较低位;如果哈希值在 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(使用前将#替换为@)

这个 HashSet 如何产生排序输出? 的相关文章

随机推荐

  • 引用 google-play-services 库

    我正在使用 Google Maps Android API v2 开发一个项目 当我开始引用 google play services lib 时遇到问题 我的项目图标上出现一个红色感叹号 并且 问题 选项卡中出现一条错误消息 我使用的是
  • EF Code First 不生成表

    我正在开发 EF Code First 站点 并且编写了我的类和上下文类 其来源是 using System using System Collections Generic using System Linq using System T
  • 使子元素(带填充)为父元素的 100% 宽度和高度

    是否可以使子元素 带填充 具有其父元素的 100 宽度和高度 html div div div css child padding 15px 我尝试将子项设置为 100 宽度 高度 但这会使子项由于填充而大于父项 我还尝试使子位置绝对并将顶
  • 修复通过 REST API 上传文件时 Artifactory 中的校验和

    我使用下面的代码通过 Artifactory 的 REST API 上传文件 我的问题是 当我通过 GUI 查看文件时 我收到以下消息 客户端未发布校验和值 如果您信任上传的内容 您可以通过单击 修复 来接受实际的校验和 校验和按钮 如何修
  • 如何使用响应大小的图像来防止卡顿并减少布局偏移?

    我的网站托管了大量各种尺寸的图像 这些图像具有响应能力 并且可以在从桌面到移动设备的所有浏览器宽度上更改大小 我在 Google Search Console 中看到我的 CLS 累积布局偏移 很差 为 0 25 秒 我的网站布局随着图像加
  • 如何用C实现动态调度表

    首先 我了解如何使用函数指针和字符串或其他查找来实现调度表 这不是挑战 我正在寻找的是一种动态向该表添加条目的方法在编译时 我希望的代码结构类型是这样的 Strategy h 包含调度程序的函数定义和调度表定义 Strategy c 包含调
  • 如何在iPhone OS上通过编程发送usd请求

    如何在iPhone OS上通过编程发送usd请求 例如 100 CTCallDialWithID 100 1 并与 CoreTelephony 链接
  • Pycharm 中的多个右边距

    我正在学习 Pycharm Community Edition 3 4 我想知道除了其余代码的常规边距之外 是否可以仅为注释和文档字符串设置正确的边距 我问这个问题是因为我试图遵守 PEP8 指南 即每个注释 72 个字符 常规代码 79
  • 是否有用于创建特定大小的测试文件的Python模块?

    我有一台已上传文件的服务器 我需要分析到该服务器的各种文件大小的上传 响应时间 即上传 10kb 文件 100mb 文件和许多其他大小的文件需要多长时间 我想避免手动创建所有文件并存储它们 是否有一个 Python 模块可以让您创建任意大小
  • 如何从 java 检查 PATH 和 CLASSPATH 环境变量?

    我正在制作一个java程序来使用JMF读取audio wav文件 每次我的计算机重新启动时 我都必须从cmd设置路径 set CLASSPATH WINDIR java classes jmf jar WINDIR java classes
  • 当我关闭 Zope 服务器时,它显示 AttributeError

    我正在使用 Plone 4 3 3 创建我的 Plone 站点 但是当我关闭服务器时 它显示以下错误 Traceback most recent call last File Plone zinstance parts instance b
  • 如何从 Gradle 中的 JAR 中排除资源并通过 IntelliJ 运行

    我最近开始工作 7 年多旧项目 which 使用 Ant Ivy用于依赖关系和构建管理 我的任务是将其转换为 Gradle但结构有点不传统 projectRoot folderA folderB projectX conf file1 tx
  • 如何将数据集对象存储到数据类型对象的包变量中?

    如何将数据集对象存储到数据类型的包变量中Object并将其从脚本任务中分配回另一个数据集对象 这是我之前的答案中的代码示例 它展示了如何在脚本任务中从对象变量填充 OleDB 数据适配器 您可以使用数据流任务中的记录集目标将记录集存储到对象
  • 如何合并两个有序的对象列表?

    public class ListMerge public static void main String args Scanner input new Scanner System in System out println Input
  • 如何在 Entity Framework Core 中克隆实体?

    我尝试使用 SetValues 方法克隆实体 但出现以下错误 无法跟踪实体类型 TariffPeriod 的实例 因为已跟踪具有相同键值 Id 的另一个实例 附加现有实体时 请确保仅附加一个具有给定键值的实体实例 这是代码 var peri
  • 确保 MediaPlayer onCompletionListener 被调用并且线程没有死

    我有一个反复出现的警报 它会触发一个 BroadcastReceiver 启动一个 IntentService 该 IntentService 使用 MediaPlayer 播放声音 但是 我的 OnCompletionListener 用
  • 向 D3.js 轴添加特定刻度

    我创建了一个轴d3 svg axis和时间刻度 并对刻度生成器产生的刻度感到满意 但是 我想确保始终标记特定值 例如 如果生成器生成以下日期 2000年1月1日 2001年1月1日 2002年1月1日 2003年1月1日 我可能想让轴显示
  • 如何使用谷歌API保存谷歌图像中的图像?

    我正在尝试在 Google 图像中搜索一些不同的内容 并使用 java Google API 保存每个查询的第一个结果 我设法在 Google 中搜索并获取包含搜索结果的 json 对象 该对象包含包含图像的网站 而不是图像地址 code
  • 需要检查数组中的值的 Firebase 规则(安全规则中的 contains())

    如何检查 Firebase 规则中数组中的值 我正在尝试做这样的事情 root child connections auth uid child friends child someFriendId exists 因此 在当前用户的conn
  • 这个 HashSet 如何产生排序输出?

    以下代码产生输出 1 2 即使哈希集没有排序 Set set new HashSet set add new Integer 2 set add new Integer 1 System out println set 这是为什么 编辑 从