Java自定义实现equals()方法过程解析

 更新时间:2020年02月09日 09:46:01   作者:filozofio  
这篇文章主要介绍了Java自定义实现equals()方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Java自定义实现equals()方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

以常见的自定义Date类型为例,没有经验的朋友可能会觉得直接比较年月日即可,从而写出以下的实现

public class MyDate implements Comparable<MyDate> {
  private final int year;
  private final int month;
  private final int day;
  public MyDate(int year, int month, int day) {
    this.year = year;
    this.month = month;
    this.day = day;
  }
  @Override
  public int compareTo(MyDate o) {
    throw new NotImplementedException();
  }

  public boolean equals(Date that) {
    if (this.day != that.day) {
      return false;
    }
    if (this.month != that.month) {
      return false;
    }
    if (this.year != that.year) {
      return false;
    }
    return true;
  }
}

但是想要健壮地实现equals()方法,上述代码是不够的,参考以下代码

//定义为final类型:允许子类直接使用父类equals()方法是不安全的
public final class MyDate implements Comparable<MyDate> {
  private final int year;
  private final int month;
  private final int day;
  public MyDate(int year, int month, int day) {
    this.year = year;
    this.month = month;
    this.day = day;
  }
  @Override
  public int compareTo(MyDate o) {
    throw new NotImplementedException();
  }

  @Override
  //规定参数必须是Object类型
  public boolean equals(Object obj) {
    //检查是否相同引用
    if (obj == this) {
      return true;
    }
    //检查null
    if (obj == null) {
      return false;
    }
    //getClass()判断的是准确的运行时类型,instanceof的类型可以是父类或接口
    if (obj.getClass() != this.getClass()) {
      return false;
    }
    //这里类型转换一定是安全的
    MyDate that = (MyDate) obj;
    //确认关键字段都相等
    if (this.day != that.day) {
      return false;
    }
    if (this.month != that.month) {
      return false;
    }
    if (this.year != that.year) {
      return false;
    }
    return true;
  }
}

自定义equals方法的套路

  • 检查是否是同一个引用,如果是,返回true
  • 检查null值,如果是,返回false
  • 检查类型是否相同,如果不同,返回false;如果相同,进行类型转换

对每个关键字段进行比较:

4.1 如果字段是基本类型,使用==

4.2 如果字段是对象类型,使用对象的equals()方法

4.3 如果字段是个数组,比较数组的每个元素。可以考虑使用Arrays.equals(a,b)或者Arrays.deepEquals(a,b),但不是a.equals

(b)

建议

  • 如果一个字段的值完全依赖其他字段的值,可以不用比较
  • 优先比较最可能出现差异的字段
  • 如果对象实现了compareTo()方法,可以直接拿来使用。例如x.compareTo(y) == 0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中使用 RabbitMQ的教程详解

    SpringBoot中使用 RabbitMQ的教程详解

    这篇文章主要介绍了SpringBoot中使用 RabbitMQ的教程详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java 构造器原理及用法解析

    Java 构造器原理及用法解析

    这篇文章主要介绍了Java 构造器原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringCloud Gateway详细分析实现负载均衡与熔断和限流

    SpringCloud Gateway详细分析实现负载均衡与熔断和限流

    这篇文章主要介绍了SpringCloud Gateway实现路由转发,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SpringBoot中使用@scheduled定时执行任务的坑

    SpringBoot中使用@scheduled定时执行任务的坑

    本文主要介绍了SpringBoot中使用@scheduled定时执行任务的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 基于javaweb+jsp的游泳馆会员管理系统(附源码)

    基于javaweb+jsp的游泳馆会员管理系统(附源码)

    这篇文章主要介绍了基于javaweb+jsp的游泳馆会员管理系统,开发工具eclipse/idea/myeclipse/sts等均可配置运行,此源代码社和课程设计,大作业及毕业设计项目,需要的朋友可以参考下
    2022-04-04
  • idea配置检查XML中SQL语法及书写sql语句智能提示的方法

    idea配置检查XML中SQL语法及书写sql语句智能提示的方法

    idea连接了数据库,也可以执行SQL查到数据,但是无法识别sql语句中的表导致没有提示,下面这篇文章主要给大家介绍了关于idea配置检查XML中SQL语法及书写sql语句智能提示的相关资料,需要的朋友可以参考下
    2023-03-03
  • javax.servlet不存在的解决办法

    javax.servlet不存在的解决办法

    今天在关于servlet的编译中出现了一下小小的错误,发现javax.servlet不存在,本文就介绍一下解决方法,感兴趣的可以了解一下
    2021-07-07
  • Java判断一个实体是不是空的简单方法

    Java判断一个实体是不是空的简单方法

    这篇文章主要给大家介绍了关于Java判断一个实体是不是空的简单方法,实际项目中我们会有很多地方需要判空校验,文中给出了详细的示例代码,需要的朋友可以参考下
    2023-07-07
  • Spring中的Lifecycle接口使用与源码分析

    Spring中的Lifecycle接口使用与源码分析

    这篇文章主要介绍了Spring中的Lifecycle接口使用与源码分析,LifeCycle接口定义了Spring容器的生命周期,任何被Spring管理的对象都可以实现该接口,需要的朋友可以参考下
    2023-05-05
  • Spring中使用ehcache缓存的方法及原理详解

    Spring中使用ehcache缓存的方法及原理详解

    这篇文章主要介绍了Spring中使用ehcache缓存的方法及原理详解,ehcache具有很强的灵活性,提供了LRU、LFU和FIFO缓存淘汰算法,Ehcache 1.2引入了最近最少使用、最久未使用和先进先 出缓存淘汰算法, 构成了完整的缓存淘汰算法,,需要的朋友可以参考下
    2024-01-01

最新评论