为什么 resize 是这样实现的?

2024-02-07

我有几个关于重建的问题HashMaps添加新的键值对时。我将根据这些事实提出问题(它们对于 Oracle JVM 来说是正确的,不确定它们对于其他 JVM 是否正确):

  1. 调整重建大小HashMap每次当您将 HashMap 增长到大于阈值(阈值 = loadFactor*numberOfEntries)时,都会有一个更大的内表数组。新创建的 Entry 放在哪个存储桶中并不重要 - Map 仍然会变大。即使所有条目都进入一个存储桶(即它们的密钥)hashCode()返回相同的数字)。
  2. HashMap删除数据时不会缩小。即使所有钥匙都被移除HashMap,它的表的内部大小不会改变。

现在的问题是:

  1. 这些事实正确吗?

如果是,那么:

  1. 为什么要以这种方式调整大小?即使明显没有必要,是否仍打算增加内表?还是一个错误?
  2. 为什么它不收缩?

是的,这些事实是正确的。

  1. 检测是否“显然没有必要”会花费大量时间,而且几乎总是多余的,因为所有键具有相同哈希码的情况很少见。简而言之,您正在支付一笔巨额费用(跟踪一个特定哈希码的常见程度)大家只是为了在极少数情况下节省一些工作,这最终会导致成本超过节省的成本。
  2. 因为删除是一个不太常见的操作,并且通常会随后重新填充地图。如果你想用一个较小的表重新开始地图,你可以将它分配给一个new HashMap并让旧的被垃圾收集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 resize 是这样实现的? 的相关文章

随机推荐

  • SQL Server 中的列名不明确

    1 https i stack imgur com mQimv png CREATE VIEW planView SELECT planID planName cost quota maxSpeed shapedSpeed typeID t
  • 如何从给定日期获取一个月的最后一天?

    例如 给定日期是1924 年 4 月 4 日我想找出 1924 年二月的最后一天 我想出了 add month 但如果我有来自数据源的不同给定月份 它似乎不灵活 有什么好主意吗 甲骨文有一个last day http docs oracle
  • GCC 错误:命令“gcc-4.0”失败,退出状态为 1

    我正在尝试使用 Xcode 4 2 将 Fabric 安装到 Virtualenv Django 1 3 1 OS X Lion 中 这个错误似乎是相当普遍 https stackoverflow com questions 6906385
  • BigQuery:GHTorrent 何时刷新以及如何获取最新信息?

    The ghtorrent bq数据很高兴有 GitHub 的快照 但是 尚不清楚它何时更新以及我如何获取更多最新数据 理论上 每次发布新的 GHTorrent MySQL 转储时都会更新它 实际上 仍然需要对生成的 CSV 进行手动调整
  • C++ 视频流检测 FPS

    我尝试从轴或 eneo 相机获取视频流的正确 fps rtsp 192 168 0 1 554 axis media media amp I use cv VideoCapture get CV CAP PROP FPS https doc
  • 获取解决方案中使用的所有 NuGet 包的列表

    我正在寻找一种方法 使用命令行脚本而不是在 Visual Studio 中手动获取解决方案 特别是版本 中每个项目中所有使用的 NuGet 包的列表 使用包管理器控制台和命令 Get Package 给了我我想要的东西 但它在 VS 之外不
  • IAP 实际验证收据 (Swift)

    我一直在尝试在我的 spritekit 游戏中实现收据验证 我一直在关注各种教程 基本上最终得到了这段代码 enum RequestURL String case production https buy itunes apple com
  • 尝试让phonegap的Android LocalNotification插件在cordova-1.6.0中工作

    我正在尝试将使用适用于 Android 的 LocalNotification 插件的 Phonegap 1 4 1 项目升级到 cordova 1 6 0 我在这里找到了这个链接 https github com davejohnson
  • VisibleDeprecationWarning - 这是从哪里来的?

    我正在编写一些代码来用 python 模拟量子计算机 我刚刚添加了一个开始集成大于一个量子位功能的部分 然后出现了这个奇怪的错误 它没有说明是哪一行引起的 所以我什至不知道从哪里开始修复它 而且我以前从未见过它 此外 即使出现此错误 该程序
  • 无法通过 AWS EC2 实例上的 Gunicorn 访问 Django 默认应用程序

    我已经为这个问题苦苦挣扎了两天 但没有成功 我创建了一个名为 testdj 的默认 Django 1 6 1 应用程序实例 将其安装在运行 Ubuntu Server 13 10 的 Amazon AWS EC2 t1 micro 实例上
  • 如何在 IntelliJ IDEA 中使用 Lombok 生成的 setter 方法中设置断点?

    有办法进去吗智能IDEA设置一个断点在由以下方法生成的 setter 方法中Lombok 这在某些调试场景中非常有用 例如查看何时从 Hibernate 等框架调用 setter 事实上 生成的setter方法显示在IntelliJ IDE
  • 尽管有主键,MagicalRecord 关系映射仍会重复对象

    我需要一些帮助来解决我在 MagicalRecord 数据导入方面遇到的问题 我的印象是 MagicalRecord 能够通过查看主键来处理关系映射 而无需复制对象 relatedByAttribute 这是一个简单的 JSON paren
  • 哪个线程处理该信号?

    我有 2 个线程 线程 1 和线程 2 我有信号配置SIGINT 每当SIGINT发生线程2应该处理该信号 为此我写了下面的程序 include
  • 承诺的不可变性及其保证价值意味着什么?

    我试图理解es6 Promise 和常规回调之间的区别 http www datchley name es6 promises 但不要得到下面的例子 有人可以展示使用回调执行以下操作会是什么样子吗 an immediately resolv
  • 如何正确使用va_list,add,start,end?

    我正在努力创建自己的 printf 函数 我从完成主项目所需的较小功能开始 如果 i 0 我的函数应该返回参数的总和 或者如果 i 1 它应该返回作为参数传递的最后 nb 个字符串的大小总和 因此 如果我有 a out 0 2 3 3 它应
  • 使用快速步进器乘以我的原始数字而不是以前的数字

    这是我的代码 我的需要是价格标签上是否有编号 当按步进器添加时 我需要步进值来乘以我的价格数字 但我遇到这种情况 价格标签不会乘以我原来的数字 就像价格原本是 50 一样 我想显示 50 100 150 200 250 不是这样的 50 1
  • 在 Windows 中使用 SHARE 属性对文件进行内存映射(因此文件不会被锁定以防止删除)

    有没有什么方法可以将文件的内容映射到 Windows 中的内存中 而不会锁定文件 特别是 这样可以在仍进行 mmap 时删除文件 Java NIO 库在 Windows 中映射文件 这样当堆中留有任何非垃圾收集的 MappedByteBuf
  • 这是实体关系图还是类图

    嘿 基本上我对类图和 ERD 的区别感到困惑 我创建了一个我认为是 ERD 的东西 但我的室友似乎认为它是一个类图 它是什么 与已接受的答案相反 xmojmr 也注意到这是NOTUML 图 而是实体关系图 ERD 最明显的区别是连接器末端的
  • 基于参数化fixture的Pytest参数化

    我有一个类范围的参数化装置 它获取 3 个数据库的参数并返回每个数据库的连接 类中的测试使用此装置来测试每个数据库连接属性 现在我有一个带有数据库表测试的新类 我想使用上面的固定装置 但要在每个连接表上进行参数化 关于 pytest 实现这
  • 为什么 resize 是这样实现的?

    我有几个关于重建的问题HashMaps添加新的键值对时 我将根据这些事实提出问题 它们对于 Oracle JVM 来说是正确的 不确定它们对于其他 JVM 是否正确 调整重建大小HashMap每次当您将 HashMap 增长到大于阈值 阈值