Java自定义实现equals()方法过程解析
作者:filozofio 发布时间:2021-10-12 11:21:48
标签: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
来源:https://www.cnblogs.com/filozofio/p/12286045.html


猜你喜欢
- 本文实例介绍了基于socket和javaFX简单文件传输工具,分享给大家供大家参考,具体内容如下package application;im
- git仓库直达List<String> strings = Lists.newArrayList("name=kk&q
- 本文实例为大家分享了java实现简单年龄计算器的具体代码,供大家参考,具体内容如下制作一个如下图年龄计算器根据题目,我做了一个由Calend
- MyBatis添加记录后获取主键ID,这是一个很常见的需求。这个需求有分为两种情况:(1)添加单条记录时获取主键值;(2)获取批量添加记录时
- 之前文章介绍过了Fluent基本框架等,其中有几个重要的方法用到了IQuery和IUpdate对象。 这2个对象是FluentMybatis
- 前言附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加
- 很多C#的初学者在编程时都容易把抽象类和接口搞混,本文就为大家从概念上讲解抽象类和接口的区别:一、抽象类:含有abstract修饰符的cla
- 具体代码如下所示:import java.util.ArrayList;import java.util.List;import java.
- Java Json的各种处理一、net.sf.json1、Json转MapJSONObject jsonObject = JSONObjec
- 第一步:获取存储的路径 我们用/sdcard/Android/data/包名/的路径 方便我们测试查看 String path=MyAppl
- 写在前面项目中直接引用或者直接编译源码得到的ijkplayer在播放mkv文件时出现(-10000)的错误,去项目github查看了才知道,
- 一、Optional类的出现到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公
- 前言上节在谈论Bean的实例化过程时,在说明实例化后阶段时只是粗略地看了一下populateBean,并未展开分析。本节接着populate
- FPS 每秒帧数背景消除建模 BSMBackground SUbtractionBS算法图像分割(GMM-高斯混合模型)机器学习(KNN-K
- 一、前言Java 8 引入了默认方法以及可以在接口中定义的静态方法。默认方法是一个普通的 java 方法,但以 default 关键字开头,
- 目录前言代码一:代码二:方式一:方式二:方式三:总结前言之前写过多线程累加计数,原理跟本篇类似,传送门累加计数比计算数组之和逻辑稍微简单一点
- 详解java中保持compareTo和equals同步摘要 : 介绍重写equlas()和comparable接口,两者进行不相同的判断。从
- java生成json时产生栈溢出错误环境java + hibernate +html本来,java中使用json事件很正常的事,但小心有的地
- JDK 中提供了一些对无状态协议请求(HTTP )的支持,下面我就将我所写的一个小例子(组件)进行描述:首先让我们先构建一个请求类(Http
- 迪杰斯特拉算法迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算