Java 基础面试题, Java 中的 hashCode 和 equals 方法之间有什么关系?
Java 基础面试题, Java 中的 hashCode 和 equals 方法之间有什么关系?
QA
Step 1
Q:: Java 中的 hashCode 和 equals 方法之间有什么关系?
A:: hashCode 和 equals 方法在 Java 中密切相关,用于比较对象的相等性和散列码值。equals 方法用于判断两个对象是否相等,而 hashCode 方法用于生成对象的散列码。两个对象相等 (equals 返回 true)
时,它们的 hashCode 必须相同。如果违反这一约定,可能会导致集合类(如 HashMap、HashSet)在存储和检索对象时出现问题。
Step 2
Q:: 为什么重写 equals 方法时必须重写 hashCode 方法?
A:: 当一个对象被用作哈希表(如 HashMap 或 HashSet)中的键时,系统会首先调用该对象的 hashCode 方法,以确定对象存储在哪个桶中。如果两个对象根据 equals 方法被认为是相等的,它们的 hashCode 也必须相等,否则会导致相等的对象被存储在不同的桶中,从而违反哈希表的工作原理,导致数据结构错误地工作。
Step 3
Q:: 如何正确重写 hashCode 方法?
A:: 重写 hashCode 方法时,应尽量使用对象的所有关键属性来计算哈希码,以保证相等对象具有相同的哈希码。一般做法是使用对象的字段来计算一个合适的哈希码,通常通过乘以质数来避免冲突。Java 7 及以上版本可以使用 Objects.hash()
方法来简化 hashCode 的生成。
Step 4
Q:: 在什么情况下需要重写 equals 和 hashCode 方法?
A:: 通常,当你需要将对象作为键存储在基于哈希的集合(如 HashMap、HashSet)中时,就需要重写 equals 和 hashCode 方法。如果对象在集合中没有正确实现这两个方法,将会导致错误的行为,如无法正确检索、删除或识别集合中的对象。