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

HashMap没有调用Object.equals吗?

赵光赫
2023-03-14

我编写了一个类,该类重写class Object中的equals(Object)方法,以使用对象的实例值将类类型的对象与类类型的其他对象进行比较。

当我将对象的一个实例作为键放在HashMap中,然后使用一个新的但相同的对象作为键调用映射上的get(object),它返回null。

我尝试将一个新的,相同的对象传递给equals方法,它返回true,所以问题不在于我的比较代码。

从我通过调试收集的信息来看,我的对象中的equals(Object)方法从未被调用过。

但如果在HashMap中使用字符串键,然后将具有相同字符的新实例传递给get(Object),则它会成功返回值。

为什么会这样?基于equals方法的HashMap测试键需要做什么?

共有2个答案

常源
2023-03-14

您还应该覆盖hashCode,否则它将无法工作,因为HashMap(顾名思义)等同于基于散列集合的等式。重写equals的Java“荣誉代码”是,您还应该同时重写hashCode。

冯阳云
2023-03-14

您还需要覆盖Object.hashcode()。看看这个链接,因为它指定了hashcode()equals()有一个契约来确保HashTables、HashMaps和HashSets中的正确功能

在<code>哈希映射</code>中,值存储在bucket中,由键的哈希代码访问。一旦找到合适的bucket,equals方法将应用于bucket的每个成员,直到确定相等。因此,确保您的哈希算法“哈希良好”非常重要。

 类似资料:
  • 在上面的代码中,我得到的输出是: 在我做 d1.name 之后=“亚瑟” 我期望输出是

  • 问题内容: 您能帮忙检查一下为什么doFilter没有被调用吗 web.xml: 类签名: 调用http:// localhost:8080 / hello / world时 返回404 ,我在doFilter处设置了断点,看来doFilter没有被调用?(我尝试了tomcat 6.0.18、6.0.29,jdk1.6) 问题答案: 在以下情况下将不会调用该过滤器: 过滤器类在类路径中丢失和/或不

  • 扩展SherlockFragment的类具有setHasOptionsMenu(true);在onCreate()方法中。即使这样,在运行应用程序时,它也不会调用onCreateOptionsMenu()方法。 我在SO中读过这些类似的问题(Q1,Q2),没有得到任何帮助。 那会是什么原因呢? 我正在做的是,我正在从下面的地方调用一些其他的SherlockFragments。 不调用的是那些inn

  • 问题内容: 阅读:Joshua Bloch撰写的有效Java-第二版 第8项-在覆盖等于时遵守总合同: 程序员编写看起来像这样的equals方法,然后花很多时间迷惑它为什么不能正常工作的情况并不少见: [代码示例在这里] 问题在于此方法不会覆盖Object.equals,后者的参数类型为Object,而是将其重载。 代码样例: 我的问题: 为什么像此代码示例中那样重载的强类型equals方法不够用

  • 我知道这个问题已经被问过很多次并得到回答,我的问题与Firebase控制台告诉我,即使我的应用成功接收注册令牌,我的应用也从未与其服务器通信有关。 当我卸载并重新安装我的应用程序时,它会调用FirebaseMessagingService类(或者更确切地说是从它扩展的类)的onNewToken()方法。 甚至FirebaseInstanceId.getInstance()。getInstanceI

  • 问题内容: 我在告诉Android 方向更改时不打电话时遇到了麻烦。我已添加到清单中,但仍在调用方向更改时添加。这是我的代码。 AndroidManifest.xml SearchMenuActivity.java 还有我的LogCat输出 有人知道我在做什么错吗?谢谢。 问题答案: 要尝试的几件事: 而不是 确保您没有在任何地方打电话。这将导致onConfigurationChange()无法触