【问题标题】:Interview Puzzle - Why should we override hashCode and equals methods [closed]面试难题 - 我们为什么要覆盖 hashCode 和 equals 方法 [关闭]
【发布时间】:2014-09-10 09:35:30
【问题描述】:

我参加了一次面试,面试官问了一个问题

面试官 - 如果我们打算使用这个类的对象作为 HashMap 键,为什么要覆盖一个类的 hashCode 和 equals 方法。

我 - 我已经告诉了他完整的流程。 HashMap 如何在内部使用 hashcode 和 equals 方法(Bucket 逻辑)。

但他对我的回答不满意。他告诉我这只是基本用途,你已经完美地解释了它,但我想知道它的高级重要性不是基本的(他也给了我一些线索 - 它有助于内存管理)。

我在网上搜索过,但没有得到答案。

还有其他重要的吗?如果是的话是什么?

非常感谢链接/文档。

提前谢谢....

【问题讨论】:

  • 这很模糊;您想了解关于 HashMaps 的一些事情吗?
  • 内存管理?我想知道这意味着什么。
  • @OliCharlesworth 当然,如果 OP 知道面试官的真正意思,那就很模糊了,根本不会有问题 :)
  • @OliCharlesworth 我不想了解 HashMaps。我想知道 hashcode 和 equals 方法是如何负责 HashMap 中的内存管理的。我知道 hashmap 如何在内部使用 hashcode,但还有其他用途吗?
  • @AnkitSharma 我很难想到任何事情。如果您有一个返回常量值的hashCode() 实现,您的HashMap 会变成一个相当无效的链表,但您可能知道这一点。我能想到的另一件事是,如果你不覆盖equals()hashCode(),一切都将在对象标识上完成,所以如果你插入两个具有相同字段的对象,两者都会被添加,消耗更多内存,但这很明显,无论如何也不是很相关。

标签: java memory-management hashmap equals hashcode


【解决方案1】:

这可能有帮助吗? (取自http://apmblog.compuware.com/2011/12/15/the-top-java-memory-problems-part-2/

equal 和 hashcode 的错误实现

hashcode方法和内存问题的关系是 乍一看并不明显。但是,如果我们考虑 hashcode方法很重要,这样就更清楚了。

hashcode 和 equals 方法用于哈希映射中插入 并根据其键查找对象。但是,如果实施 操作员有问题,找不到现有条目和新条目 继续添加。

虽然负责内存问题的集合可以 识别速度很快,可能很难确定为什么 出现问题。

【讨论】:

  • 当然,如果你有错误,可能会发生坏事!
  • 我真的不知道 HashMap 在 java 内部是如何工作的。但是假设我想通过编写自己的哈希函数来实现自己的 HashMap。最初,我认为键在 0 到 1000 之间。如果使用良好的散列函数(几乎)均匀分布散列值,我可以说负载因子
  • @DeiAndrei 这里的问题不同,这是真正的内存泄漏情况。如果您依赖默认的eq/hc 实现,您的地图将使用对象标识。但这意味着如果您丢失了对某个键的引用(例如,您序列化和反序列化您的键对象),除了遍历它之外,没有办法从映射中删除该条目。这意味着你的键/值对象永远不会被垃圾回收,除非地图本身是。
  • 正如 Oli 已经提到的那样,错误总是一件坏事。完整的文章(间接地)指出,equals() and hashCode()` 的实现不遵守与另一个对象相等的对象必须返回相同的 hashCode 的约定。因此,只要我遵守合同,应该没有问题。不遵守合同显然是一个错误,因此有错误的软件会导致问题(即使在覆盖方法时)。
  • @UwePlonus 这是对事物的一种相当简单的看法,与问题本身无关。问题是关于该错误的潜在影响,了解这一点很重要。
猜你喜欢
  • 2019-01-22
  • 1970-01-01
相关资源
最近更新 更多