当前位置: 首页 > 知识库问答 >
问题:

为什么String、Integer和其他包装类在HashMap中被认为是好的键?

鞠修雅
2023-03-14

为什么String、Integer和其他包装类被认为是好的键?

我找到了下面的答案-

String、Integer和其他包装类是HashMap键的自然候选项,而且String也是最常用的键,因为String是不可变的和最终的,并且覆盖equals和hashcode()方法。

其他包装类也共享类似的属性。为了防止用于计算hashCode()的字段发生变化,需要不变性,因为如果关键对象在插入和检索期间返回不同的hashCode,就不可能从hashMap获取对象。不可变性是最好的,因为它提供了其他优点,如线程安全,如果您可以通过只使某些字段为最终字段来保持您的hashCode相同,那么您也可以这样做。由于equals()和hashCode()方法是在从HashMap检索value对象的过程中使用的,所以关键对象正确地重写这些方法并跟随Contact是很重要的。如果不相等的对象返回不同的hashcode,那么发生冲突的几率就会更小,从而提高HashMap的性能。

共有1个答案

逄嘉禧
2023-03-14

在大多数map实现中,条目是根据键的状态存储的。如果密钥更改,则无法检索给定密钥的条目。

HashMap处理键的HashCode()值。如果该键的hashcode()值是从不可变状态生成的,则它将是常量。由于这些类型是不可变的,它们的(外部)属性也是不可变的,并且它们的hashcode()是从这些属性生成的,因此这些类型中的任何一个键都不能更改,这个问题就不存在了。

 类似资料:
  • 问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。

  • 我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。 所以首先,我想确认我理解正确。 据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。 有了这些,我的问题是:使用

  • 我听到一些人说,即使在使用获得种子之后,使用也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

  • 我正在按照这篇文章撤销用户访问权限: http://bitoftech . net/2014/07/16/enable-oauth-refresh-tokens-angular js-app-using-ASP-net-we b-API-2-owin/ 现在考虑一下,在验证用户之后,我已经发布了一个访问令牌,使用期限为30分钟,如上面的文章所示,刷新令牌为1天,但是如果管理员在10分钟内删除该用户

  • 问题内容: 我发现了一些奇怪的异常: 怎么可能呢?每个对象都可以转换为String,不是吗? 代码是: 谢谢。 问题答案: 为什么这不可能: 因为String和Integer不在同一对象层次结构中。 您尝试的转换仅在相同的层次结构中有效,例如 在这种情况下,或或将起作用。 因此,正如其他人已经提到的,要将整数转换为字符串,请使用: 或对于原始 要么 为对象。

  • 问题内容: 我有一个类的以下代码,它工作正常: 但是,我认为在该方法中实现OnClickListener是一种不好的做法。为什么会有这种不好的做法,还有什么更好的选择? 问题答案: 最好在ViewHolder中处理单击逻辑的原因是,它允许更明确的单击侦听器。如Commonsware书中所述: 很久以来,ListView行中的可单击小部件(如RatingBar)一直与行本身的单击事件发生冲突。获取可