gpt4 book ai didi

Java HashMap 或 IdentityHashMap

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:18 25 4
gpt4 key购买 nike

在某些情况下,map 中使用的键对象不会覆盖 Object 中的 hashCode() 和 equals(),例如,使用 socket Connection 或 java.lang.Class 作为键。

  1. 将这些对象用作 HashMap 中的键是否存在任何潜在缺陷?
  2. 在这些情况下我应该使用 IdentityHashMap 吗?

最佳答案

如果 equals()hashCode() 没有在键对象上被覆盖,HashMap 和 IdentityHashMap 应该具有相同的语义。默认的 equals() 实现使用引用语义,默认的 hashCode() 是对象的系统标识哈希码。

这仅在对象的不同实例在逻辑上可以被视为相等的情况下才有害。例如,如果您的键是:

new Integer(1)

new Integer(1)

因为这些在技术上是 Integer 类的不同实例。 (你真的应该使用 Integer.valueOf(1),但这已经离题了。)

Class 作为键应该没问题,除非在非常特殊的情况下(例如,hibernate ORM 库在运行时生成类的子类以实现代理。)作为开发人员,我会对将 Connection 对象作为键存储在 Map 中的代码持怀疑态度(如果您正在管理数据库连接,也许您应该使用连接池?)。它们是否有效取决于实现(因为 Connection 只是一个接口(interface))。

此外,重要的是要注意 HashMap 期望 equals()hashCode() 确定保持不变。特别是,如果您实现一些在键对象上使用可变字段的自定义 hashCode(),则更改键字段可能会使键“丢失”在 HashMap 的错误哈希表存储桶中。在这些情况下,您可以使用 IdentityHashMap(取决于对象和您的特定用例),或者您可能只需要不同的 equals()/hashCode() 实现。

关于Java HashMap 或 IdentityHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com