Java集合——3.编写equals方法
Java中的equals方法
在Java编程中,判断两个对象是否相等是一个常见需求。无论是在集合中查找元素,还是比较对象内容,都离不开equals方法。
equals方法的作用
equals方法用于判断两个对象是否"相等",但这里的"相等"并非指引用相同(即==的含义),而是指两个对象的内容或逻辑状态是否一致。
在集合操作中:
List.contains(Object o):通过equals判断是否包含指定元素List.indexOf(Object o):通过equals查找元素位置Set:通过equals确保元素唯一性Map:通过equals判断键的相等性
==与equals的区别
==:判断两个引用是否指向同一个对象(内存地址相同)equals:判断两个对象的内容或逻辑状态是否相等
示例:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false(不同对象)
System.out.println(s1.equals(s2)); // true(内容相同)
equals方法的实现规范
要正确实现equals方法,必须遵循以下规范:
- 自反性:对于任何非null对象
x,x.equals(x)必须返回true - 对称性:对于任何非null对象
x和y,若x.equals(y)为true,则y.equals(x)也必须为true - 传递性:对于任何非null对象
x、y、z,若x.equals(y)和y.equals(z)为true,则x.equals(z)也必须为true - 一致性:只要对象状态未变,多次调用
equals应返回相同结果 - 非空性:任何非null对象
x,x.equals(null)必须返回false
这些规范看似复杂,但只要按照标准模式实现,就能满足所有要求。
正确实现equals方法的步骤
以Person类为例,我们需要根据业务逻辑定义"相等"的标准(如姓名和年龄都相同则认为相等):
import java.util.Objects;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 实现equals方法
@Override
public boolean equals(Object o) {
if (o instanceof Person p) {
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
}
常见错误及解决方案
错误1:null.equals(null)
null 是字面量,不是对象,不能调用方法,因此 null.equals(null) 会编译错误NullPointerException。
解决方案:应使用 Objects.equals() 方法来安全地比较两个可能为 null 的对象,避免调用 null.equals()。
总结
- 理解
equals与==的本质区别:equals判断内容相等,==判断引用相同 - 标准实现步骤:
- 用instanceof判断传入的待比较的Object是不是当前类型,如果是,继续比较,否则,返回false;
- 对引用类型用Objects.equals()比较,对基本类型直接用==比较。
- 引用类型比较应使用
Objects.equals处理,省去了判断null的麻烦。两个引用类型都是null时它们也是相等的。
Java集合——3.编写equals方法的更多相关文章
- 廖雪峰Java5集合-2List-2编写equals方法
List是一种有序链表: List内部按照放入元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 boolean contains(Object o) 是否包含某个元素 int indexOf( ...
- 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述方法
下面给出一个实例,重新编写equals()方法,提供自定义的相等标准 public class PersonTest { public static void main(String[] args) ...
- java提高篇(十三)-----equals()方法总结
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- [转]java基础学习总结——equals方法
一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...
- JAVA面试题:equals()方法和== 区别
http://bbs.csdn.net/topics/390000725 总结: equals在没重写之前和==一样,重写之后,equals只要内容一样即为true equals跟==一般情况下是等价 ...
- 【java基础】==与equals()方法比较
1.八种基本类型 只有"=="方法进行判断是否相等,比较的是基本数据类型的值,没有equals()方法 2.Java类库中的类 "=="比较的是对象的句柄,即内 ...
- java基础学习总结——equals方法
一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static vo ...
- Java Object类及其equals方法
基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超 ...
- Java中==号与equals()方法的区别
String str1 = new String("abc"); String str2 = new String("abc"); System.out.pri ...
- Java Object类的equals()方法
所有类都从Object类中继承了equals方法,Object类中equals方法源代码如下: public boolean equals(Object obj) { retu ...
随机推荐
- 获取Harbor镜像仓库指定Project的容量使用并进行企业微信告警
简单说明 在镜像仓库的维护中,有时我们需要根据镜像仓库的使用情况进行及时的告警和扩容,避免镜像仓库容量满载时再进行扩容,这样会造成业务的阻塞. 这里我们使用Python简单写一个实现获取镜像仓库指定项 ...
- Tauri2.0-DeepSeek电脑端Ai对话|tauri2+vite6+deepseek流式ai聊天系统
重磅新作tauri2.0+vue3.5+deepseek+arco桌面客户端ai流式输出聊天对话系统. tauri2-vue3-deepseek:桌面端ai聊天对话,基于Tauri2.x+Vite6集 ...
- ARCHIV_CREATE_FILE 员工头像上传
*&---------------------------------------------------------------------* *& Report ZHRR_011 ...
- HDFS目录配额(quota)不足导致写文件失败
本文分享自天翼云开发者社区<HDFS目录配额(quota)不足导致写文件失败>,作者:5****m 问题背景与现象 给某目录设置quota后,往目录中写文件失败,出现如下问题"T ...
- AI应用实战课学习总结(4)医疗数据可视化
大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第4站,通过一个经典的医疗数据集来进行数据可视化的实战. 数据集介绍 这 ...
- layui 父级页面传值给子页面layer.open
在子页面定义一个方法, 子页面 function child(obj) { } 父级页面 var iframe = window[layero.find('iframe')[0]['name']]; ...
- java日常问题和技巧1(BigDecimal与int相互转换、判断某元素是否在数组中、求两个List并集、int[]转Integer[])
1.BigDecimal与int相互转换: 1 import java.math.BigDecimal; 2 public class HelloWorld { 3 public static voi ...
- vitepress动态导航
前言 我需要根据动态设置导航. 比如根据不同的路由设置不同的顶部导航. 但是vitepress并没有相关配置,但是我们可以通过拦截主题修改全局状态来完成这个功能! 核心知识 创建文件,xxx/docs ...
- 前端开发系列125-进阶篇之Iterator
本文简单说明[ 迭代器接口 Iterator]() 接口的基本使用,涉及 Array .Set .Map 和 String 以及伪数组等数据结构,以及 `for...of`循环的用法等. Iterat ...
- PDD 笔试反思记录
一个二叉树的有2016个节点 最多有几个拥有两个子节点的 应该是1007 我擦写错了 第二个求一个直线段的长度 不知道对错 没有参考意义 第三个是输出旋转数组 源码 #include< ...