我们可以将嵌套映射作为其他映射中的键吗?

2024-03-25

我刚刚开始用 Java 实现数据结构,想知道我们是否可以遇到这样的情况。

Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>(); 

如果是的话,请举一个小例子。

如果您没有发现相关问题,请在评论中提及,


You can这样做,但大多数情况下不应该这样做。

映射的键需要保持不变,并且需要设置其 equals 和 hashcode 才能给出正确的行为。如果您在将某个键添加到映射后对其进行修改,那么该映射就会失效。

HashMap 可以修改,因此不应用作键。

为了解释为什么改变它是一个问题,你需要知道哈希图是如何工作的。这非常简单,但假设你有一个HashMap H包含两个桶。我们称它们为 B0 和 B1。

每当你添加一个Object to the HashMap它看着那个物体hashCode。如果最后一位为 0,则进入 B0,如果为 1,则进入 B1。

现在,当查找一个对象时,它会查看hashCode并立即转到正确的桶中,然后只需要搜索该桶中的对象即可找到所需的对象。

通过使用超过 2 个存储桶,您可以将每个存储桶中的项目数量减少 2、4、8 或更多倍,从而减少需要检查的对象数量。

然而,假设您将一个对象放入地图中,它会被添加到 B0。然后更改对象,hashCode 也会更改,因此最后一位现在为 1。

如果你这样做map.contains(obj)你会得到 false 结果,因为它会查看 hashCode,直接跳转到 B1 并且只扫描该对象。但该对象被放置在 B0 中,因为这是插入时的 hashCode。

这就是为什么对于在 HashMap 中用作键的任何对象,hashCode 必须是常量,否则您可能会“丢失”这些键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以将嵌套映射作为其他映射中的键吗? 的相关文章

随机推荐

  • NetBeans 12 不再管理库

    一周前 我将 Java IDE 升级到 Netbeans 12 和 JDK 14 直到昨天我才注意到窗口 项目属性 MYPROG 缺乏基本功能 即没有用于编译的行 jar 并且大多数情况下没有任何行可以添加 jar库 而是有一个空行Java
  • 如何在 xamarin android 应用程序中使用动画?

    我想使用 Xamarin C 在我的 Android 应用程序中使用动画 动画 如淡入 放大 移动等等 首先在 resources 文件夹下添加一个文件夹 将其命名为 anim 然后你可以向其中添加你的动画资源 例如 对于淡入动画 在 an
  • 检查 JQuery 移动复选框是否被选中

    我有一个复选框列表 我想获取每个复选框的状态 名单在这里 div fieldset fieldset div
  • 有没有办法在 Zend Framework 1.5 中执行“INSERT...ON DUPLICATE KEY UPDATE”?

    我想用ON DUPLICATE KEY UPDATE在 Zend Framework 1 5 中 这可能吗 Example INSERT INTO sometable VALUES ON DUPLICATE KEY UPDATE 我在 Ze
  • 实施委托

    我想我正在关注代表团的运作方式 这是我遵循的教程 http www iphonedevsdk com forum iphone sdk tutorials 81489 how why implement delegation pattern
  • 在导入 Google 电子表格之前过滤 CVS

    我在 Google 电子表格中有一个脚本 该脚本从 URL 下载压缩的 CSV 然后将其导入电子表格 实际上 CVS 太大了 我不需要其中的所有数据 我的问题是 如何在将数据导入电子表格之前过滤数据 例如 使用 X 值过滤 A 列 这是我到
  • Java 线程是如何工作的

    我是一名Java学习者 试图理解线程 我期望下面的程序按顺序输出 线程已启动 运行方法 再见 但我按顺序得到输出 再见 线程已启动 Run 方法 这是我的代码 public class RunnableThread public stati
  • 实体框架继承映射 (TPH)

    我正在努力将项目从 nHibernate 转换为实体框架 并陷入映射继承的映射问题 我有以下基类 为简洁起见缩短 public abstract class Status public Guid Id get set public stri
  • Android 应用程序中的多个包

    我在我的应用程序中包含了另一个开发人员免费提供的课程 他的班级有不同的包 这会在 Android 市场等方面造成任何问题吗 应用程序中的每个类都需要是我自己的包吗 尽管这是一个非常古老的问题 但我想澄清一下 Java 级 包 问题所在 和
  • 带有 SSIS 包的 SQL Server 作业 - 无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B

    我有一个运行 SSIS 包的 SQL 服务器作业 该作业有 9 个步骤 每个步骤都从不同的数据库中提取数据 连接字符串被定义为每个步骤中的参数 当我运行作业时 我收到以下错误 Executed as user USER MYSERVER M
  • 下划线模板抛出变量未定义错误

    我看过一些关于主干js主题的视频 这是直接来自视频的示例 这是从 2012 年开始的 所以我认为主干规则 库已经改变 但我不明白为什么这目前不起作用 在视频中 该人展示了它在 JS Fiddle 中运行 但我无法让它工作 我已经在 J S
  • 如何使用 Resharper 对类型成员重新排序?

    典型场景 很多人都参与过的课程 我想按字母顺序对方法 属性等进行排序 我希望能够在本地区或全球范围内的课堂上做到这一点 我看到 Resharper 中的功能可以做到这一点 但它似乎没有做任何事情 使用 清理代码 功能 可以在 语言 C 类型
  • 一个流中的多个“匹配”检查

    是否可以检查数组 或集合 是否包含元素 5and5 以外的元素 one返回布尔结果的流而不是使用两个流 int ints new int 1 2 3 4 5 boolean hasFive IntStream of ints anyMatc
  • Savefig 输出空白图像

    我正在尝试保存使用 matplotlib 绘制的图 但是 图像保存为空白 这是我的代码 plt subplot 121 plt imshow dataStack cmap mpl cm bone plt subplot 122 y copy
  • 如何在 android 中创建视频网址的缩略图?

    我有一个问题 我只能创建本地视频文件的缩略图 而不能创建远程 URL 的缩略图 这是我的代码 bmThumbnail ThumbnailUtils extractThumbnail ThumbnailUtils createVideoThu
  • 淘汰赛和 jQuery 自动完成

    淘汰值绑定不适用于 jquery 自动完成 如何让它发挥作用 我有一个模板
  • sbrk 在 malloc.c 中如何/在何处使用?

    我在 高级 Unix 编程 以及其他几本书 中读到 Linuxmalloc 使用Linux系统调用sbrk 向操作系统请求内存 我正在看 glibcmalloc c代码 我可以看到很多提及sbrk 在注释中 但没有在代码中直接引用 如何 在
  • 有没有更聪明的方法从位数组中提取?

    我有可以被视为 位数组 的内存区域 它们相当于 unsigned char arr 256 但最好将其视为 bit arr 2048 我正在访问其中的单独位 define GETBIT x in in x 8 1 lt lt 7 x 8 但
  • 在qml中的qtcharts上拖动一个点

    我正在尝试在 qtcharts 上拖动 LineSeries 上的一个点 这是我的代码 import QtQuick 2 0 import QtCharts 2 0 Item anchors fill parent ChartView ti
  • 我们可以将嵌套映射作为其他映射中的键吗?

    我刚刚开始用 Java 实现数据结构 想知道我们是否可以遇到这样的情况 Map