java中重写equals和重写hashCode()

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倍数加法算法,这种算法能够避免生成相同的哈希值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中重写equals和重写hashCode() - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 零基础掌握JDBC操作MySQL

    零基础掌握JDBC操作MySQL 什么是JDBC? JDBC全称为Java Database Connectivity,即Java数据库连接。JDBC API提供了一个标准接口来与各种关系型数据库进行交互。 JDBC操作MySQL的步骤 步骤1:加载JDBC驱动程序 在使用JDBC连接MySQL之前,需要先加载JDBC驱动程序。MySQL官方提供了JDBC驱…

    Java 2023年5月19日
    00
  • MyBatis映射器mapper快速入门教程

    MyBatis是一款基于Java语言的ORM框架,能够帮助开发者轻松完成SQL语句的映射配置,提高开发效率。在使用MyBatis框架时,最常用的就是映射器mapper,本篇文章就来详细讲解一下MyBatis映射器mapper的快速入门教程,包括如何创建映射器mapper、配置映射关系及映射器的使用。 创建MyBatis映射器mapper 创建MyBatis映…

    Java 2023年5月20日
    00
  • 利用Java获取文件名、类名、方法名和行号的方法小结

    下面我来详细讲解一下“利用Java获取文件名、类名、方法名和行号的方法小结”的完整攻略。 获取文件名、类名、方法名和行号攻略 在Java开发中,我们有时候需要获取当前文件名、类名、方法名和行号等信息,以便于进行调试和日志输出等操作。下面是具体的获取方法: 获取文件名 获取当前文件名可以使用File类中的方法,具体代码如下: File file = new F…

    Java 2023年5月31日
    00
  • 为eclipse和IDEA配置tomcat服务器的方法

    为eclipse配置tomcat服务器: 下载安装tomcat服务器 在官网下载tomcat服务器压缩包,解压到本地目录即可(这里以Tomcat9为例): $ tar -zxvf apache-tomcat-9.0.50.tar.gz -C /usr/local 安装eclipse插件 打开eclipse,点击Help -> Eclipse Marke…

    Java 2023年5月19日
    00
  • 史上最全MyBatis面试题及答案

    史上最全MyBatis面试题及答案攻略 什么是MyBatis?它的作用是什么? MyBatis是一个持久层框架,用于简化Java应用程序中的数据库交互。它使用XML或注解来描述对象映射器,从而实现将Java对象映射为数据库表中的数据。MyBatis的主要作用是:简化数据库交互代码的编写,防止SQL注入攻击,提高代码的可维护性和可读性。 MyBatis中的Ma…

    Java 2023年5月20日
    00
  • Spring Boot 捕捉全局异常 统一返回值的问题

    Spring Boot是一个快速构建Spring应用程序的框架,可以快速实现RESTful API的开发。在开发过程中,我们难免会遇到异常,如数据库连接异常、空指针异常等。如果不处理这些异常,可能会导致应用程序挂掉,或出现不可预期的结果。而且在开发中,我们也需要统一的返回值格式,这样可以提高开发效率。 因此,本文将详细讲解如何通过Spring Boot捕捉全…

    Java 2023年5月27日
    00
  • Java文件操作类 File实现代码

    一、File类概述 在Java编程中,经常需要对文件进行操作,比如读写文件内容、创建或删除文件等。Java中提供了一个File类,能够完成文件的相关操作。 File类是用来表示一个文件或者目录(文件夹)的抽象路径名。在实际使用中需要注意,File对象表示的是在代码中的抽象概念,并不一定要对应实际存在的文件或目录。 在Java中使用File类时,需要先创建一个…

    Java 2023年5月20日
    00
  • java实现折半排序算法

    Java实现折半排序算法 折半排序(Binary Insertion Sort)是插入排序的一种改进版本,与插入排序相同的是,该算法的平均时间复杂度也为O(n^2),但是折半排序的优势在于其最坏时间复杂度为O(n^2)。 1. 算法原理 折半排序的算法原理如下: 从第2个元素开始,依次将元素插入到已排序的序列中。 每次插入时使用折半查找的方式,找到插入元素应…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部