equals()方法的重写

2023-11-20

equals()本身是一个方法,并不是运算符,而且仅适用于引用数据类型

“==”在java的引用数据时使用时,比较的并不是具体的数值,而是地址值。此时并不能有效地比较引用数据类型中的具体数据,比较地址值对于引用数据类型而言没有用,就出现了equals()方法的重写

//此处需要注意的是,equals()方法的重写在编译器中是可以自动生成的

重写equals()的规定

1、对称性 x.equals(y)如果结果为true,那么y.equals(x)的返回结果应该也是true

2、自反性 x.equals(x)的结果应该也是true

3、传递性 如果x.equals(y)结果为true,y.equals(z)的结果也是true,那么z.equals(x)的结果也一定为true

4、一致性 无论x.equals(y)重复多少次,其结果应该不会发生改变

5、特殊情况,x.equals(null)应该返回的结果是flase

注:idea自动生成equals()方法,首先alt+insert,点击equals() and hashcode()选项进行自动生成

Chinese是一个用来举例的类,Person是他的父类

import java.util.Objects;

public class Person
{
    private String name;
    private int age = 1;
    private boolean isMale;
    public void eat()
    {
        System.out.println("人可以吃饭");
    }
    public void sleep()
    {
        System.out.println("人可以睡觉");
    }
    public void talk(String language)
    {
        System.out.println("人可以说话,使用的是:"+language);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public boolean isMale() {
        return isMale;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setMale(boolean male) {
        isMale = male;
    }
};
class Chinese extends Person{
    private String nation;

    public void setNation(String nation) {
        this.nation = nation;
    }

    public String getNation() {
        return nation;
    }

    public void sleep()
    {
        System.out.println("中国人会睡觉");
    }

    public void eat()
    {
        System.out.println("中国人会睡觉");
    }

    public void talk(String language)
    {
        System.out.println("中国人可以说话,说的是"+ language);
    }

    @Override
    public String toString() {
        return "Chinese{" +
                "nation='" + nation + '\'' +
                '}';
    }
}
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
//首先利用“==”可以判断二者是否指向的是同一个地址,或者是同一个对象
//如果是的话就可以直接返回true,节省步骤
        if (o == null || getClass() != o.getClass()) return false;
//判断o是否时null,也就是上面注意事项五的提到的特殊情况
//二者如果父类不相同的的话,那么就绝不可能属性也相等
        Chinese chinese = (Chinese) o;
//对o进行强制转化
        return Objects.equals(nation, chinese.nation);
//针对特定属性,equals也会比较值,此时nation和chinese.nation都是属性值
//可以直接进行比较,且会返回准确的ture和flase
    }

当存在多个属性的时候

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                isMale == person.isMale &&
                Objects.equals(name, person.name);
//此时会用一个判断语句直接对几个属性返回的值进行判断
//其他的步骤和以上基本一致
    }

不过当父类中已经有equals的重写,会影响子类equals的重写,比如在对Person类进行重写之后,再对Chinese类中的equals进行重写时,明显比之前重写的equals多了一步调用父类的equals

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
//此处会先判断,父类中继承的属性是否相等,所以直接调用父类中的equals
//根据返回结果再决定是否要进行比较
        Chinese chinese = (Chinese) o;
        return Objects.equals(nation, chinese.nation);
    }

测试代码如下

public class Persontext
{
    public static void main(String[] args) {

        Chinese c1 = new Chinese();
        Chinese c2 = new Chinese();
        Chinese c3 = new Chinese();

        c1.setName("tom");
        c1.setNation("chinese");
        c1.setAge(18);
        c1.setMale(true);

        c2.setName("tom");
        c2.setNation("chinese");
        c2.setAge(18);
        c2.setMale(true);

        c3.setName("Tom");
        c3.setNation("USA");
        c3.setAge(20);
        c3.setMale(false);

        System.out.println(c2.equals(c1));

        System.out.println("******************************");

        System.out.println(c2.equals(c3));

    }
};

测试结果

 

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

equals()方法的重写 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • Android kotlin使用注解实现防按钮连点功能

    SingleClick Retention AnnotationRetention RUNTIME Target AnnotationTarget FUNCTION annotation class SingleClick 点击间隔时间 毫
  • 计算机网络那些事之 MTU 篇

    哈喽大家好 我是咸鱼 今天我们来聊聊计算机网络中的 MTU Maximum Transmission Unit 什么是 MTU MTU Maximum Transmission Unit 是指数据链路层中的最大传输单元 通俗点来讲 MTU
  • 建模方法(十)-灰色预测模型GM(1,1)

    引言 灰色预测的主要特点是模型使用的不是原始数据序列 而是生成的数据序列 其核心体系是灰色模型 Grey Model 简称GM 即对原始数据作累加生成 或其它方法生成 得到近似的指数规律再进行建模的方法 灰色预测模型对于不同问题采用不同模型
  • git常见问题总结

    文章目录 1 xxx com port 22 Connection refused 2 xcrun error invalid active developer path 3 终端使用git发现不能用这么办 4 lt lt lt lt lt
  • Python手册(Python Basics)--Python基础

    本站已停止更新 查看最新内容请移至本人博客 Wilen s Blog 文章目录 对象 标量 运算符 数据类型 tuple 元祖 list 列表 dict 字典 set 集合 列表 集合和字典推导式 iterator 迭代器 and gene
  • 设置mysql远程登录

    要将MySQL的root用户授权远程登录 请按照以下步骤操作 使用root用户登录到MySQL mysql u root p 在MySQL命令行中 输入以下命令以创建root用户可以从任何IP地址访问的用户 GRANT ALL PRIVIL
  • java: 二元运算符 ‘<‘ 的操作数类型错误 第一个类型: java.lang.Object 第二个类型: java.lang.Object

    在对对象进行大小比较时 运行就会出现下面报错 原因不能使用 gt 运算符对两个Object对象进行比较 gt 运算符只能直接用于原始整数类型 解决方法 1 将Object进行转换 转换成比如转换成Character类 String类 Int
  • 二分答案总结&例题解析

    对于二分我们最初的了解 就是在一个一次函数中 对于要求的点 x y 已知y 对于包含x值的区间二分 根据函数值与y比较 逐步靠近要求的点 直到最终求出要求的点 在程序执行时 二分的时间复杂度为logn 可以极大的减少查找的时间 二分的应用
  • Fiddler的安装和使用教程(详细)

    一 安装 1 fiddler工具下载网址 http www telerik com download fiddler 2 运行 FiddlerSetup exe一键完成安装 3 安装成功后点击关闭按钮 所选路径下多出一个Fiddler文件夹
  • 朋友问我,程序员和非程序员的思维模式有什么区别?

    英文 https javascript plainenglish io what is the difference in thinking model between programmers and normal persons 8ff8
  • dokcer命令一览

    Docker服务状态 安装参考 https yutian blog csdn net article details 119705377 1 为什么要使用Docker Docker是开发运维一体化的核心工具 提高开发 测试 运维的生命周期的
  • Linux下安装tomcat

    1 上传tomcat到root目录 通过ftp软件将tomcat上传到root目录下 在 usr local 创建一个tomcat目录 复制tomcat到 tomcat目录下 解压 tar 运行命令 tar xvf apachexxx 2
  • 如何在Oracle VM VirtualBox上安装ubuntu

    虚拟机链接 Virtual Box Downloads Oracle VM VirtualBox Ubuntu Ubuntu系统下载 Ubuntu 点开链接后进入首页如图 点击桌面系统进入 点击下载 下载完成后不用解压 打开Oracle V
  • 数学建模:18 粒子群算法

    目录 基础的粒子群算法 流程图 核心公式 改进惯性权重 线性递减的惯性权重 非线性递减的惯性权重 自适应的惯性权重 随机的惯性权重 改进学习因子 压缩学习因子 非对称学习因子 改进 自动退出迭代 测试函数 Matlab 自带的粒子群函数 p
  • 一种把四个字节(BYTE)组成一个32位int型的方法

    实现代码如下 int ConvertTo32 int la int lb int lc int ld la 0XFFFFFF la lt lt 24 lb 0XFF00FFFF lb lt lt 16 lc 0XFFFF00FF lc lt
  • linux扩展/dev/sda1分区方法

    一 准备 扩展虚拟机的磁盘空间 在虚拟机关闭状态下 点击虚拟机 gt 设置 gt 硬盘 gt 扩展 扩展自己需要的容量 二 开始扩展 idriver ubuntu su 1 切换至root用户 root ubuntu home idrive
  • Kettle教程(一):ETL简介、Kettle安装部署

    文章目录 前言 一 ETL 1 ETL是啥 2 ETL有啥价值 二 Kettle 1 简介 2 安装 三 总结 前言 随着大数据的不断发展 企业级别的数据转换显得尤为重要 从本文开始和大家一起学习一款开源ETL工具 Kettle 一 ETL
  • Android手写占位式插件化框架之Activity通信、Service通信和BroadcastReceiver通信

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 1 什么是插件化 能运行的宿主APP去加载没有下载的APK文件 并使用APK文件里面的功能 这就叫插
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • equals()方法的重写

    equals 本身是一个方法 并不是运算符 而且仅适用于引用数据类型 在java的引用数据时使用时 比较的并不是具体的数值 而是地址值 此时并不能有效地比较引用数据类型中的具体数据 比较地址值对于引用数据类型而言没有用 就出现了equals