java中重写equals和重写hashCode()

2023-12-11java编程
16

Java中的equals()方法用于比较两个对象是否是相同的,而hashCode()则用于给对象生成一个唯一的哈希值。在某些情况下,需要重写这两个方法来确保正确的对象比较和哈希码生成。

重写equals和hashCode()方法的原因

默认情况下,Java对象的equals()方法比较的是对象的引用。也就是说,只有当两个对象的引用指向同一个内存地址时,它们才被认为是相同的。但是在实际场景中,很多情况下需要比较的是对象的某些属性。例如,比较两个人是否是同一个人,应该比较的是它们的身份证号码,而不是它们在内存中的地址。

因此,我们需要重写equals()方法,以便在对象比较时比较它们的属性值而不是引用地址。而hashCode()方法与之配合使用,它生成的哈希值用于快速比较两个对象是否相等,从而提高了程序的性能。

重写equals()方法的步骤

  1. 判断两个对象是否引用同一个内存地址,是则返回true。
  2. 判断对象是否为null,是则返回false。
  3. 判断两个对象的类是否相同,如果不是则返回false。
  4. 将对象转换为相应的类类型,判断属性值是否相等,如果相等则返回true,否则返回false。

示例1

下面是一个Person类示例,其中重写了equals()方法:

public class Person {
    private String name;
    private int age;

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Person)) {
            return false;
        }
        Person person = (Person) obj;
        return this.name.equals(person.name) && this.age == person.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

在上面的例子中,equals()方法首先检查两个对象是否是同一个引用,如果是则返回true。然后检查传入的对象是否是Person类型,如果不是则返回false。最后比较两个对象的属性值,如果相等则返回true。

在HashCode()方法中,使用了Java 7新增的Objects.hashCode(Object…values)方法,它可以根据属性值来生成哈希码值。

重写hashCode()方法的步骤

hashCode()方法的重写要求同一个类的两个对象必须生成同样的哈希码值,如果生成不同的哈希值,那么在使用哈希表等数据结构时就会出现错误。

  1. 声明一个int类型的变量result,并将其初始化为初始值,例如17。
  2. 将对象的属性值和result组合成一个 hash code。
  3. 如果属性值为引用类型,递归调用它的hashCode()方法。
  4. 返回result。

示例2

下面是一个User类示例,其中重写了hashCode()方法:

public class User {
    private String username;
    private String password;

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof User)) {
            return false;
        }
        User user = (User) obj;
        return this.username.equals(user.username) && this.password.equals(user.password);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + username.hashCode();
        result = 31 * result + password.hashCode();
        return result;
    }
}

在上面的例子中,hashCode()方法中组合了username和password属性的哈希值,采用了经典的31倍数加法算法,这种算法能够避免生成相同的哈希值。

The End

相关推荐

一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用
Lambda表达式是Java 8中引入的新特性之一,它是一个匿名函数,可以捕获参数并表现为一个代码块,而不像方法一样需要一个固定的名称。它主要用于传递行为或代码块以及事件处理等操作。...
2023-12-11 java编程
30

基于Java 谈回调函数
下面为您详细讲解基于Java的回调函数。...
2023-12-11 java编程
21

java equals函数用法详解
在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自...
2023-12-11 java编程
63

JavaWeb学习笔记分享(必看篇)
JavaWeb是Java在Web领域的应用,是目前非常热门的技术之一。但是JavaWeb涉及到的技术非常广泛,初学者很容易迷失方向。本文总结了JavaWeb的基础知识,为初学者提供了一份学习笔记分享,希望能够帮助大家快速入门。...
2023-12-11 java编程
8

Java中replace、replaceAll和replaceFirst函数的用法小结
在Java编程中,字符串操作是很常见的,而替换字符串是其中常用的操作之一。Java提供了三种函数用于替换字符串:replace、replaceAll和replaceFirst。这篇文章将为您详细介绍它们的用法。...
2023-12-11 java编程
121

基于Java中进制的转换函数详解
进制是数学中一种表示数值大小的方法,常见的进制有10进制、2进制、16进制等。...
2023-12-11 java编程
45