java中equals的重写_Java重写equals方法(重点讲解)

2023-10-31

为什么equals()方法要重写?

判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象。这样我们往往需要重写equals()方法。

我们向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals方法。

怎样重写equals()方法?

重写equals方法的要求:

1、自反性:对于任何非空引用x,x.equals(x)应该返回true。

2、对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。

3、传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。

4、一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。

5、非空性:对于任意非空引用x,x.equals(null)应该返回false。

1、自反性原则

在JavaBean中,经常会覆写equals方法,从而根据实际业务情况来判断两个对象是否相等,比如我们写一个person类,根据姓名来判断两个person类实例对象是否相等。代码如下:

1 public classPerson {2 privateString name;3

4 publicPerson(String name) {5 this.name =name;6 }7

8 publicString getName() {9 returnname;10 }11

12 public voidsetName(String name) {13 this.name =name;14 }15

16 @Override17 public booleanequals(Object obj) {18 if (obj instanceofPerson) {19 Person person =(Person) obj;20 returnname.equalsIgnoreCase(person.getName().trim());21 }22 return false;23 }24

25 public static voidmain(String[] args) {26 Person p1 = new Person("张三");27 Person p2 = new Person("张三 ");28 List list = new ArrayList();29 list.add(p1);30 list.add(p2);31 System.out.println("是否包含张三:" +list.contains(p1));32 System.out.println("是否包含张三:" +list.contains(p2));33 }34 }

list中含有这个生成的person对象,结果应该为true,但是实际结果:这里考虑了字符串空格的问题,去除前后的空格。

是否包含张三:true

是否包含张三:false

第二个为什么会是false呢?

原因在于list中检查是否含有元素时是通过调用对象的equals方法来判断的,也就是说 contains(p2)传递进去会依次执行p2.equals(p1)、p2.equals(p2),只要一个返回true,结果就是true。但是这里p2.equals(p2)返回的是false?由于我们对字符前后进行了空格的切割造成p2.equals(p2)的比较实际上是:“张三   ”.equals(“张三”),一个有空格,一个没有空格就出错了。

这个违背了equals的自反性原则:对于任何非空引用x,x.equals(x)应该返回true。

这里只要去掉trim方法就可以解决。

2、对称性原则

上面这个例子,还并不是很好,如果我们传入null值,会怎么样呢?增加一条语句:Person p2=new Person(null);

结果:

是否包含张三:trueException in thread"main" java.lang.NullPointerException//空指针异常

原因在执行p2.equals(p1)时,由于p2的name是一个null值,所以调用name.equalsIgnoreCase()方法时就会报空指针异常。

这是在覆写equals方法时没有遵循对称性原则:对于任何应用x,y的情形,如果想x.equals(y)返回true,那么y.equals(x),也应该返回true。

应该在equals方法里加上是否为null值的判断:

1 @Override2 public booleanequals(Object obj) {3 if (obj instanceofPerson) {4 Person person=(Person) obj;5 if (person.getName() == null || name == null) {6 return false;7 }else{8 returnname.equalsIgnoreCase(person.getName());9 }10 }11 return false;12 }

3、传递性原则

现在我们有一个Employee类继承自person类:

1 public class Employee extendsPerson{2 private intid;3

4

5 public int

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中equals的重写_Java重写equals方法(重点讲解) 的相关文章

  • StringBuffer与StringBuilder的区别

    StringBuffer与StringBuilder的区别 雷亚文的博客 CSDN博客 一 String StringBuffer与StringBuilder String字符串常量 String的值是不可变的 这就导致每次对String的
  • 【C++】初识C++

    目录 一 什么是C 二 C 的发展史 三 C 的重要性 1 语言的使用广泛度 2 工作领域 四 如何学习C 1 别人怎么学 2 自己怎么学 1 多总结 2 多看经典书籍 3 多刷题 一 什么是C C语言是结构化和模块化的语言 适合处理较小规
  • uniapp 页面旋转后,返回上一页,页面变形的解决办法

    进入横屏页面 返回上一页A的上一页B 再由B进入A
  • Pandas知识点-合并操作combine

    Pandas知识点 合并操作combine combine是联合的意思 在Pandas中 combine 方法也是一种实现合并的方法 本文介绍combine 方法的用法 一 combine first 实现合并 在介绍combine 方法前
  • rename函数在R语言中的使用及DataFrame变量抽取与重命名实战

    rename函数在R语言中的使用及DataFrame变量抽取与重命名实战 在R语言中 rename函数常用于对DataFrame数据进行列名的修改和重命名操作 DataFrame是一种非常常见的数据结构 它由行和列组成 类似于Excel中的
  • 2023.6.26

  • 【SWT】Composite中的子控件居中设置

    简介 SWT Composite是一种用于构建Java图形用户界面的工具包 它提供了丰富的控件和容器来创建复杂的用户界面 在一些情况下 需要将子控件在SWT Composite中进行居中设置 本篇博客将详细介绍如何在SWT Composit
  • mysql数据库应该怎么存储数组

    MySQL 数据库没有专门用于存储数组的数据类型 因此 如果你想在 MySQL 中存储数组 你可以使用以下几种方法之一 将数组转换为字符串 然后使用字符串类型 例如 VARCHAR 存储 例如 可以将数组 a b c 转换为字符串 a b
  • 【计算机网络】物理层(超多图详析)

    最近建立了一个知识库 里面很多相关知识 欢迎来访 https www yuque com zhumulangmafeng 5sdfr 前言 上一期我们已经完成了计算机网络 总览 知道了一些计算机网络的基础内容 如果你漏掉了 建议你先去看看上
  • 虚拟+现实:半实物仿真测试有效保证嵌入式系统的健壮与可靠

    随着现代信息技术与软硬件技术的快速发展 嵌入式系统的功能日益强大 嵌入式设备和软件应用领域越来越宽泛 近年来 嵌入式软件代码量呈爆炸式增长 对测试的要求越来越高 尤其是涉及防务 航空 汽车等安全关键领域 更加全面 系统的测试方法是必不可少的
  • 中国互联网技术联盟发布首个“互联网+”权威定义

    2015年5月 6月 7月 国家密集性的发布了三大重型文件 中国制造2025 大众创业万众创新政策措施意见 互联网 行动指导意见 随后 中国互联网技术联盟邀请专家委员会对此专门进行了闭门研讨和解读梳理 并将梳理成果向业界正式发布 一 基于互
  • [Wc2007]剪刀石头布【竞赛图最大三元环个数+费用流】

    题目链接 BZOJ 2597 给定一个存在不确定边的竞赛图 求原图有向三元环数的最大值 有些边是不确定方向的 我们需要给这些边定向来使得三元环的数目最多 总所周知 由三个点的竞赛图组成的三元环 每个点的入度都应该为1 这样才可以组成一个三元
  • [DCDC](DC-DC 电感)纹波率r是难题?来我这里来学习

    大家可能都有深刻体会 电子知识博大精深 无穷无尽 每个简单的知识点背后 都蕴含着无穷无尽的宝藏 古人云 学无止境 我现在就是这种感觉 学的越多 也就更加战战兢兢 如履薄冰 但我始终相信 虽然知识是无限的 但人的能力也是无限的 只要你肯 明天
  • kubeasz一键部署harbor、containerd运行时、高可用k8s(1.26.x)集群-Day 02

    1 生产环境部署架构 1 多master节点 实现master节点的高可用和高性能 2 单独的etcd分布式集群 生产使用SSD盘 高可用持久化k8s资源对象数据 并实现高可用 3 多node节点运行业务pod node节点可以是不同硬件规
  • 升级Linux下的sudo

    1 sudo 命令情景分析 介绍 Linux 下使用 sudo 命令 可以让普通用户也能执行一些或者全部的 root 命令 本文就对我们常用到 sudo 操作情景进行简单分析 通过一些例子来了解 sudo 命令相关的技巧 情景一 用户无权限
  • git常用命令记录

    多人合作开发代码提交流程 暂存新增的代码 快捷使用 git stash git stash save record 更新代码 快捷使用 git pull git pull origin master 释放刚刚暂存的代码 git stash
  • PMP考试必备-概念区分篇(二)

    一 组织过程资产和经验教训的区别 组织过程资产包括 模版 数据库 经验教训 模版和数据库是相对客观的资料 经验教训都是主观总结出来的东西 二 经验教训和问题的区别 1 经验教训必须和选择有关 你的选择让你感到得意或后悔的事情 叫经验教训 2
  • 【全网最强】2022年最新,一文带你学习并掌握C/C++基础知识,技巧,举一反三,C/C++语法知识与实用技巧。题解两种代码(C语言和C++).覆盖知识面广.代码有注释让你理解更快

    必须读的 前言 通俗易懂 小白来了都说好 包括C C 基本知识 精选136道题 C C 语法知识与实用技巧 题解两种代码 C语言和C 覆盖知识面广 1 变量 表达式与顺序语句 2 scanf printf语法及判断语句 3 循环语句 4 数
  • c言语库函数qsort的最详细用法

    qsort递增排序 qsort函数参数 void qsort void base 要比较数组的起始地址 size t num 要比较数组的大小 size t width 一个数组元素的大小 int comple const void ele

随机推荐

  • 蓝桥杯单片机数码管技巧

    数码管使用技巧 1如何运用数码管配合按键切换界面显示切换界面 方法 定义一个变量来显示显示界面 通过按键来改变变量的数值 从而切换显示界面 include
  • VS+QT没有自动生成.ui对应的ui_XXXX.h头文件问题

    1 在qt安装包下 gt qbase gt bin 目录下有对应的uic exe用来生成 ui对应的ui XXXX h头文件 所以 cmd进入bin目录 运行uic XXXX ui ui XXXX h就可以生成 也可以添加路径进行指定 如
  • EOS 数据签名与公匙验证代码用例

    本文编写了一个小例子诠释了EOS是如何对数据签名与校验的 通过本文可以理解了签名的重要性和数据的不可篡改性 系统 ubuntu 版本为EOS1 1 1 注 因为本文的程序是把EOS里面的钱包和fc工具的代码全部提取出来编译的 这个过程相对复
  • Redis简单入门

    一提起数据库 大多数人可能想到的主要是Oracle MySQL以及Microsoft SQL Server这三大巨头 但除了这三巨头外 很多新兴的数据库也慢慢进入开发者的眼帘 比如最近越来越火的搜索引擎式数据库Elasticsearch D
  • 202303读书笔记

    202302读书笔记 长安的荔枝 只要肯努力 办法总比困难多 长安的荔枝 这本书真是酣畅淋漓啊 读起来一气呵成 以讲故事的口吻叙述 上林署九品小官员 李善德 兢兢业业工作多年 终于借贷买了房 让妻子儿女有一个安身之所 一面沉浸在喜悦里 一面
  • 顺序表----数组结构c++

    include
  • js数组sort()方法按指定顺序排序

    数组的sort 方法可以把数组排序 不传参数的默认按字典排序 sort 方法还接受一个回调函数 按回调函数内代码逻辑排序 该函数要比较两个值 然后返回一个用于说明这两个值的相对顺序的数字 比较函数应该具有两个参数 a 和 b 若 a 小于
  • Centos7 rsync 实现文件同步

    rsync remote sync 是unix及类unix平台下的数据镜像备份软件 它不像FTP那样需要全备份 rsync可以根据数据的变化进行差异备份 从而减少数据流量 提高工作效率 序号 类型 ip 1 server 10 200 13
  • Unity LayerMask 的切换功能的实现

    组里需求 需要做一个按钮用来开启和关闭不同层的渲染 这是一个简单的问题 但是实现起来稍微繁琐 实现一个layermask的切换状态 你可能会做 你需要读取当前的某个层的状态 将该层的状态设置为相反的状态 因为layermask设计为二进制保
  • 记录好项目D13

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个宠物商城系统 一 系统介绍 未注册用户 非注册用户 即游客身份 进入宠物官网首页 可以浏
  • redis-cli

    文章目录 集群中手动切换节点 xac xed 问题 查看集群节点 集群中手动切换节点 connect host port xac xed 问题 首先出现这个现象是因为序列化器没设置好 直接 get xac xed x00 x05t x00
  • Python os.walk 遍历指定深度的方法

    用os walk可以遍历多层目录 但是有时需要只遍历指定层数目录 比如 要获取某个目录的1级和2级子目录 可以用下面的方法 coding UTF 8 Python 3 6 import os def get sub dirs root pa
  • xss-labs靶场训练(1~4关)

    第一关 前端F12查看代码 这里只能看到参数test输出在h2里面 可以尝试直接构造payload 成功 后台关键源码 这里是以GET方法获取参数name 并直接输出 没有任何过滤或转义 第二关 尝试上一关的方法 Payload没有执行成功
  • 第四十七节 C++ 匿名函数对象 - lambda 表达式

    函数对象 函数的对象 实现operator 常用于算法中 详见上一节函数对象的讲解 lambda表达式属于函数对象 但其是匿名的 分为 1 一元函数的lambda表达式 不使用捕获列表 使用捕获列表 2 一元谓词的lambda表达式 不使用
  • linux shell脚本双引号转义,Linux Shell脚本中单引号(‘)和双引号(“)的区别

    在Linux操作系统上编写Shell脚本时候 我们是在变量的前面使用 符号来获取该变量的值 通常在脚本中使用 param 这种带双引号的格式 但也有出现使用 param 这种带引号的使用的场景 首先大家看一段例子 root linux na
  • JAVA代码保护工具DashO Pro v10.0.0 Beta 2重磅上线!更新DashO Gradle插件!

    DashO是一个Java和Android的混用程序 它提供企业级应用的加固和屏蔽 大大降低了知识产权盗窃 数据盗窃 盗版和篡改的风险 分层混淆 加密 水印 自动失效 反调试 反篡改 反仿真器 反挂钩 反根设备解决方案 为世界各地的应用程序提
  • 单片机毕业设计 stm32智能电子秤系统设计与实现 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 4 1 STM32F103C8T6 4 2 HX711压力传感器 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目
  • Simulink Simscape基础仿真电路

    在网上找了挺多关于MATLAB Simulink simscape仿真电路的资料都没有自己想要的 大都是Sympowersystem的教程 最后还是上了YouTube观看了一些教程 现在做下学习记录 由于我电脑上安装了2016和2010两个
  • 身份和访问管理解决方案:混合型IAM

    对于依赖于本地 IT 基础结构和传统安全模型的组织 可以更轻松地验证和授权企业网络内的所有内容 包括设备 用户 应用程序和服务器 尝试从公司网络外部获取访问权限的用户使用虚拟专用网络 VPN 和网络访问控制 NAC 进行身份验证 随着云和远
  • java中equals的重写_Java重写equals方法(重点讲解)

    为什么equals 方法要重写 判断两个对象在逻辑上是否相等 如根据类的成员变量来判断两个类的实例是否相等 而继承Object中的equals方法只能判断两个引用变量是否是同一个对象 这样我们往往需要重写equals 方法 我们向一个没有重