Java面试题:请你谈谈hashCode()和equals()的区别是什么?为什么重写equals()就要重写hashCode()?
得分点:hashCode() 用途,equals() 用途,hashCode()、equals() 约定
标准回答:
在Java中,hashCode()
方法的主要用途是获取对象的哈希码,而 equals()
方法主要用来比较两个对象是否相等。这两个方法之间存在两个约定:
- 约定一:相等对象必须具有相同的哈希码
- 如果两个对象被认为相等,那么它们必须具有相同的哈希码。这意味着如果
equals()
方法返回true
,那么这两个对象的hashCode()
值也必须相等。
- 如果两个对象被认为相等,那么它们必须具有相同的哈希码。这意味着如果
- 约定二:相等的哈希码不一定表示相等的对象
- 两个对象的哈希码相等不一定意味着这两个对象相等。换句话说,如果两个对象的
hashCode()
值相等,它们仍然需要通过equals()
方法进行进一步的比较来确定是否相等。
- 两个对象的哈希码相等不一定意味着这两个对象相等。换句话说,如果两个对象的
另外,需要注意的是,默认情况下,Object
类提供的 equals()
方法使用 ==
运算符来比较两个对象,即只有两个对象是同一个对象时,才会返回相等的结果。然而,在实际业务中,通常的需求是,如果两个不同的对象的内容相同,就应该认为它们相等。因此,通常需要重写 equals()
方法,以满足业务需求。
由于 hashCode()
方法与 equals()
方法具有联动关系,因此在重写 equals()
方法时,通常也需要重写 hashCode()
方法,以确保这两个方法始终满足上述两个约定。这有助于维护对象在哈希表等数据结构中的正确行为。