为什么要重写hashCode()和equals()(深入了解)

简介: 为什么要重写hashCode()和equals()(深入了解)

在Java中,hashCode()equals()Object 类中的两个重要的方法。这两个方法在处理集合类(如 HashMapHashSet)时特别重要,因为它们影响着对象在这些集合中的行为。以下是为什么在自定义类中需要重写这两个方法的原因:

  1. 哈希表性能:
  • hashCode() 方法返回对象的哈希码,用于在哈希表中确定对象的存储位置。
  • 当你将对象放入哈希表(例如 HashMapHashSet)时,哈希表使用对象的哈希码来决定存储位置。如果两个对象相等,它们的哈希码应该相等。
  • 如果你重写了 equals() 方法,就应该同时重写 hashCode() 方法,以确保相等的对象具有相等的哈希码,这样可以提高哈希表的性能。
  1. 集合类的使用:
  • 在使用集合类时,例如 HashSet,这些集合类依赖于 equals()hashCode() 方法来判断对象是否相等。
  • 如果你的类不重写这两个方法,它将继承自 Object 类的默认实现,该实现基于对象的引用,而不是对象的内容。这可能导致集合类无法正确处理相等性。
  1. 正确性和一致性:
  • 根据 Java 规范,如果两个对象通过 equals() 方法判断相等,那么它们的哈希码应该相等,以确保一致性。
  • 如果你的类不重写 hashCode(),那么即使两个对象通过 equals() 判断相等,它们的哈希码可能不相等,违反了这个规范。

下面是一个简单的例子,演示了为什么在自定义类中需要重写 hashCode()equals() 方法:

public class Person {
    private String name;
    private int age;
    // constructors, getters, setters, etc.
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

在这个例子中,equals() 方法比较对象的内容,而 hashCode() 方法使用对象的字段来生成哈希码。这确保了当两个 Person 对象通过 equals() 判断相等时,它们的哈希码也相等。

相关文章
|
30天前
|
存储 算法 Java
为什么要重写 hashcode 和 equals 方法
为什么要重写 hashcode 和 equals 方法
22 0
|
4月前
|
存储
重写equals后为什么要重写hashcode方法
重写equals后为什么要重写hashcode方法
44 0
|
3月前
|
存储 IDE Java
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
为什么重写 equals() 时必须重写 hashCode() 方法?(简单易理解)
17 1
|
8月前
|
存储
为什么重写 equals 方法就必须重写 hashCode 方法?
为什么重写 equals 方法就必须重写 hashCode 方法?
60 0
|
9月前
|
存储 Java
重写equals方法
我们在java程序中调用自带的equals方法时,你是否会有这样的疑问:明明我比较的数据都一样啊,为什么会返回false呢?有些人可能还会疑问,怎么有时候返回true?有时候返回false呢?这是为什么呢?其实是和Java底层人家写的equals方法逻辑有关系
|
9月前
为什么要重写 hashcode 和 equals 方法?
为什么要重写 hashcode 和 equals 方法?
55 0
|
存储 NoSQL
简单讲一下 HashCode() 与 equals()方法
简单讲一下 HashCode() 与 equals()方法.
86 0
hashCode和equals的区别
hashCode和equals的区别
273 0
|
Oracle Java 关系型数据库
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
首先我们有一个假设:任何两个 object 的 hashCode 都是不同的。 那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算出来的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无法相认,就和 equals() 条件矛盾了,证毕。
119 0
为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap
|
测试技术
hashCode和equals的区别(二)
Hello,大家好,我是子悠,作为本周的小编我已经不想跟大家介绍自己了,这篇文章让我们跟随 Jay Pan( 哇,一位新作者哦)的步伐学习知识吧。下面是正文。 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。下面我们一起来看一下,它们到底有什么区别,总结一波!