Java 面试难题-为什么我们要覆盖hashCode和equals方法

Java 面试难题-为什么我们要覆盖hashCode和equals方法,java,memory-management,hashmap,equals,hashcode,Java,Memory Management,Hashmap,Equals,Hashcode,我参加了一次面试,面试官问了我一个问题 采访者-如果我们要将类的对象用作HashMap键,为什么要重写类的hashCode和equals方法 我-我已经告诉了他整个流程。HashMap如何在内部使用hashcode和equals方法(Bucket逻辑) 但他对我的回答不满意。他告诉我这只是基本用途,你已经很好地解释了它,但我想知道它的高级重要性,而不是基本的(他也给了我一些线索——它有助于内存管理) 我在网上搜索过,但没有得到答案 还有其他重要的事情吗?如果是,是什么 如需链接/文件,将不胜感激

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

采访者-如果我们要将类的对象用作HashMap键,为什么要重写类的hashCode和equals方法

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

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

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

还有其他重要的事情吗?如果是,是什么

如需链接/文件,将不胜感激

提前感谢……

这可能会有帮助吗?(摘自)

equal和hashcode的错误实现

hashcode方法与内存问题之间的关系如下 乍一看不明显。但是,如果我们考虑 hashcode方法非常重要,这一点变得更加清晰

hashcode和equals方法在哈希映射中用于插入 并根据对象的关键点查找对象。但是,如果 操作员有故障,未找到现有条目和新条目 继续添加

而负责内存问题的集合可以是 识别速度非常快,可能很难确定 问题出现了


这是相当模糊的;你想知道一些关于HashMaps的知识吗?内存管理?我想知道这意味着什么。@OliCharlesworth当然,如果OP知道面试官的真正意思,那就没有问题了:)@OliCharlesworth我不想知道哈希图。我想知道hashcode和equals方法是如何负责HashMap中的内存管理的。我知道HashMap如何在内部使用hashcode,但还有其他用途吗?@AnkitSharma我很难想到任何东西。如果您有一个返回常量值的
hashCode()
实现,您的
HashMap
将变成一个相当无效的链表,但您可能知道这一点。我能想到的另一件事是,如果不重写
equals()
hashCode()
,所有操作都将在对象标识上完成,因此如果插入两个具有相同字段的对象,这两个对象都将被添加,消耗更多内存,但这是非常明显的,也不是非常相关的。当然,如果您有bug,坏事可能会发生!我真的不知道HashMap在java内部是如何工作的。但假设我想通过编写自己的哈希函数来实现自己的哈希映射。最初,我认为键在0到1000之间。如果通过使用一个好的散列函数,散列值(几乎)均匀分布,我可以说,对于负载因子<0.80的情况,冲突的次数会非常少。当我达到这个加载因子时,我会将散列的大小增加一倍。但这与执行时间有关,而不是内存使用情况@Deandrei这里的问题不同,这是一个真正的内存泄漏情况。如果依赖默认的
eq/hc
实现,则贴图将使用对象标识。但这意味着,如果丢失了对键的引用(比如序列化和反序列化键对象),则除了在映射中进行迭代之外,无法从映射中删除该项。这意味着您的键/值对象将永远不会被垃圾收集,除非映射本身被垃圾收集。完整的文章(间接地)指出,
equals()和
hashCode()`实现没有遵守这样的约定,即等于另一个对象的对象必须重新生成相同的hashCode。所以只要我坚持合同就应该没有问题。不遵守合同显然是一个缺陷,因此有缺陷的软件会导致问题(即使在重写方法时)。@UwePlonus这是一个相当简单的观点,与问题本身无关。问题是关于bug的潜在影响,这一点很重要。