怎么重写equals()方法

2023-11-02

equals()方式是顶级父类Object中的方法,自定义类若想重新写equals()方法,则需要考虑以下几个特性

  1. 自反性:对于任何非null的引用值,x.equals(x)必须返回true
  2. 对称性:对于任何非null的引用值x和y,当且仅当y.euqals(x)返回true时,x.equals(y)必须返回true
  3. 传递性:对于任何非null的引用值x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也必须返回true
  4. 一致性:多次调用equals方法结果不变
  5. 对于任何非null的引用值,x.equals(null)必须返回false

结合所有这些要求,得出一下实现高质量equals方法的诀窍

  1. 使用==操作符检查"参数是否为这个对象的引用"
  2. 使用instranceof操作符检查"参数是否为正确的类型"
  3. 把参数转化成正确的类型
  4. 对于该类中的每个"关键域",检查关键域是否与该对象中对应的域相匹配

例子:

public final class PhoneNumber {
    
    private final short areaCode;
    
    private final short prefix;
    
    private final short lineNum;

    public PhoneNumber(short areaCode, short prefix, short lineNum) {
        this.areaCode = areaCode;
        this.prefix = prefix;
        this.lineNum = lineNum;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PhoneNumber that = (PhoneNumber) o;
        return areaCode == that.areaCode && prefix == that.prefix && lineNum == that.lineNum;
    }

    @Override
    public int hashCode() {
        return Objects.hash(areaCode, prefix, lineNum);
    }

下面是最后的一些告诫

  1. 覆盖equals总要覆盖hashCode
  2. 不要企图让equals方法过于智能
  3. 不要将equals声明中的Object替代那个替换为其他的类型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Java基础-作用域

    基本概念 在Java当中 主要的变量就是属性 成员变量 和局部变量 java中作用域的分类 全局变量 也就是属性 作用域为整个类体 局部变量 除了属性之外的其他变量 作用域为定义的代码块当中 目录 局部变量 举例 结果 局部变量没有默认值
  • Scala安装

    1 需要到官方下载window版本的Scala2 12x 注意去官方第找到Download下载 2 直接下载 第二种下载方式打开技能大赛课程里面的资料 3 双击安装文件进行安装 在安装的过程需要注意安装目录不要空格 中文和特殊符号 建议在D
  • Docker安装和Portainer图形界面安装

    文章目录 1 概述 2 docker简介 2 1 架构 2 2 优点 2 3 docker和虚拟机比较 比如vmware 3 docker安装 centos环境 3 1 卸载旧版本 没有可以不执行 3 2 设置仓库 3 3 正式安装 3 4
  • 数组练习题2

    1 题目 打印杨辉三角的前n行 注 杨辉三角的本质是它的两条斜边都是1 其余数则等于它肩上的两个数之和 如 1 11 121 1331 14641 思路 计算杨辉三角的时候1 先定义第一列的值为1 2 定义对角线上的值为1 3 根据某项值
  • 卸载 kubernetes

    kubeadm reset f modprobe r ipip lsmod rm rf kube rm rf etc kubernetes rm rf etc systemd system kubelet service d rm rf e
  • linux:真机安装centos linux(突发事件:解决卡在安装界面){寻找镜像--u启制作--引导u盘--解决卡在安装界面--安装配置}

    首先准备一个8 16 g的u盘 格式为 fat32 寻找镜像 寻找可以上阿里云或者各大镜像网站以及官网寻找 我是在阿里云找的 阿里巴巴开源镜像站 OPSX镜像站 阿里云开发者社区 aliyun com 寻找你要找的版本 我这里就选7 9版本
  • 【JAVA并发编程-黑马】第一章

    文章目录 一 创建线程的几种方式 二 查看进程的方法 三 线程运行原理 栈桢Debug 四 线程运行原理图解 4 1 类加载 4 2 启动main线程 五 线程上下文切换 Thread Context Switch 六 常用方法 6 1 r
  • 【记录11】前端项目上传至gitee仓库及相关命令

    本篇文章适用于初次使用git base来上传项目至gitee仓库的初学者 使用git base来上传项目至国内gitee 判断当前项目是否连接仓库 2022 3 29 查看当前的用户 git config user name 查看当前用户地
  • Android Genemotion模拟器一直卡在黑屏界面

    Android Genemotion模拟器一直卡在黑屏界面 解决办法 调大对应的模拟器的内存 第一步 右键你要修改的模拟器 弹出的菜单中选择 Settings 第二步 增大或者减小内存
  • MySQL必知必会 学习笔记 第九章 用正则表达式进行搜索

    正则表达式是用来匹配文本的特殊的串 它用正则表达式语言来建立 MySQL支持的正则表达式仅为正则表达式的一个很小的子集 可通过WHERE子句使用正则表达式过滤SELECT检索出的数据 检索条件列包含字符100的所有行 SELECT colu
  • 如何搭建websocket及使用

    保持一个长连接 当服务端有新的消息 能够实时的推送到使用方 像知乎的点赞通知 评论等 都可以使用WebSocket通信 那该如何搭建呢 首先在utils文件夹下创建一个websocket ts文件 import onUnmounted fr
  • java手动抛出异常、用户自定义异常类、异常处理5个关键字、throw和throws的区别

    文章目录 1 6手动抛出异常 1 6 1代码 1 6 2结果 1 6 3throw和throws的区别 1 7用户自定义异常类 1 8异常处理5个关键字 1 9综合练习 1 9 1主函数 1 9 2自定义异常类 1 10一首小悟结束异常处理
  • 【牛客KY45】——skew数(取余法int类型溢出 改用char字符串数组)

    include
  • vue js 语音播报 语音读文字 window.speechSynthesis new SpeechSynthesisUtterance (补充无声音 问题解决办法)

    存在问题1 在google chrome 89版本之后 默认使用的线上服务来合成语音 所以在国内可能会没有声音 解决办法 通过getVoices 获取 localService为true 的字段 localService true 表示 使
  • git在linux bash下显示分支信息

    linux bash平台下查看linux分支 bash profile 在 bash profile加上以下两句 function git branch name git symbolic ref short q HEAD 2 gt dev
  • Hook原理--逆向开发

    今天我们将继续讲解逆向开发工程另一个重要内容 Hook原理讲解 Hook 可以中文译为 挂钩 或者 钩子 逆向开发中改变程序运行的一种技术 按照如下过程进行讲解 Hook概述 Hook技术方式 fishhook原理及实例 符号表查看函数名称
  • XSL中template的match属性匹配模式

    出处 http www cnblogs com ygcao archive 2010 05 23 1742247 html 匹配模式 1 匹配根节点
  • 使用sqlserver镜像时的JDBC连接字符串

    使用sqlserver数据库镜像时 有两个数据库 主库和镜像库 两个IP地址 以前的连接串只有一个地址 连接串该怎么写 查了网上的一些资料 新的JDBC支持此功能 在以前的每个连接串里面加上一个Failover partner 的参数就可以
  • 运放震荡自激原因及解决办法

    运放震荡自激的原因 1 环路增益大于1 2 反馈前后信号的相位差在360度以上 也就是能够形成正反馈 参考 自控原理 和 基于运算放大器和模拟集成电路的电路设计 自激振荡的引起 主要是因为集成运算放大器内部是由多级直流放大器所组成 由于每级
  • 怎么重写equals()方法

    equals 方式是顶级父类Object中的方法 自定义类若想重新写equals 方法 则需要考虑以下几个特性 自反性 对于任何非null的引用值 x equals x 必须返回true 对称性 对于任何非null的引用值x和y 当且仅当y