Java中的equals方法详解:比较方法

news2024/12/21 19:16:08

 

1、equals方法的背景

在Java中,equals方法是Object类的一个方法,用于比较两个对象是否相等。

Java中有两种比较对象的方法:==运算符和equals方法。

==运算符用于比较两个对象的引用,如果它们指向的是同一个对象,则返回true;而equals方法用于比较两个对象的内容是否相等,当它们的内容相等时,则返回true。因此,equals方法可以用于比较两个值相同的字符串、整型等基本数据类型,或需要通过内容比较才能确定相等的自定义类对象等。

2、equals方法的使用

如何覆盖equals方法

在Java中,一个类如果想要正确地使用equals方法,一定要对该方法进行覆盖。覆盖equals方法的意思是,将equals方法从Object类中继承来的实现替换为自己的实现。如果不覆盖equals方法,则调用该方法时会使用继承的Object类的实现,这种默认实现无法提供正确的比较行为,因为它无法知道哪些属性或状态在两个对象中是必须相同的。

因此,覆盖equals方法的必要性在于提供一个自定义的比较行为,使得该方法可以正确地比较自定义类对象的内容是否相同。而覆盖equals方法的步骤如下:

1)确定对象相等的条件;

2)覆盖equals方法,实现对象相等的比较逻辑;

3)同时覆盖hashCode方法,确保相等的对象具有相等的hashCode值。

equals方法的实现

在重写equals方法时应该遵循以下的通用标准:

1)自反性:对于任何非null的引用值x,x.equals(x)应该返回true;

2)对称性:对于任何非null的引用值x和y,如果x.equals(y)返回true,则y.equals(x)也应该返回true;

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

4)一致性:对于任何非null的引用值x和y,如果用于equals比较的对象信息没有发生变化,那么无论进行多少次比较,都应该返回true或false;

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

下面是一个重写equals方法的例子,假设我们有一个自定义的EqualsDemo类:

public class EqualsDemo {
    private String name;
    private int age;
    private double salary;

    //构造函数和getter/setter方法

    // 重写equals方法
    public boolean equals(Object obj) {
        if (obj == this) {  // 如果是同一对象,返回true
            return true;
        }
        if (!(obj instanceof EqualsDemo)) {  // 如果obj不是Employee类对象,返回false
            return false;
        }
        EqualsDemo equalsDemo = (EqualsDemo)obj;  // 强制转换为Employee类对象
        return equalsDemo.name.equals(this.name) && equalsDemo.age == this.age && equalsDemo.salary == this.salary;
    }

    // 重写hashCode方法
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        long temp = Double.doubleToLongBits(salary);
        result = 31 * result + (int)(temp ^ (temp >>> 32));
        return result;
    }
}

在这个例子中,EqualsDemo类重写了equals方法,比较了该类的三个属性:name,age和salary。如果两个EqualsDemo对象的这三个属性都相等,则这两个EqualsDemo对象相等。同时,EqualsDemo类也重写了hashCode方法,根据该类的属性计算了hashCode值。

equals方法的使用注意事项

在使用equals方法时,需要遵循以下注意事项:

1)永远不要使用equals方法比较对象的类型。如果没有覆盖equals方法,则Object.equals(Object obj)只有在obj和本身引用同一个对象时才返回true;如果覆盖了equals方法,则equals(Object obj)所接收的参数类型必须与本身的类型相同或可以强制转换成本身类型。

2)永远不要使用equals方法比较字符串常量。在Java中,字符串常量是共享的,如果用equals方法比较两个字符串常量,可能会导致不正确的结果。

3)永远不要使用equals方法比较两个浮点型或双精度型的值。由于浮点数在计算机内部只能表示近似值,所以可能会导致不正确的结果。

四、equals方法的相关问题

1. equals方法与“==”有何区别?

在Java中,==运算符和equals方法都可以用于比较两个对象。它们之间的区别在于:

==运算符用于比较两个对象的引用,如果它们指向的是同一个对象,则返回true;

equals方法用于比较两个对象的内容是否相等,当它们的内容相等时,则返回true。

例如:

Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b); //false
System.out.println(a.equals(b)); //true

在这个例子中,a和b是两个不同的Integer对象,虽然它们的值相同,但是它们指向的是不同的对象,因此使用==运算符比较时返回false。但是,因为它们的值相同,使用equals方法比较时返回true。

equals方法与hashCode方法有何联系?

在Java中,每个对象都有一个默认的hashCode值,该值是一种与该对象有关的整数,并且具有以下特性:

1)如果两个对象相等,则它们的hashCode值一定相等;

2)如果两个对象的hashCode值相等,则它们不一定相等。

因此,在覆盖equals方法时,必须同时覆盖hashCode方法,以保证相等的对象具有相等的hashCode值。hashCode方法返回的值应该根据equals方法比较的对象信息计算得出,具体实现方式可以借鉴上面的例子。

3. equal方法的效率问题

在Java中,equals方法的执行效率可能会受到多种因素的影响,例如equals方法的实现逻辑、对象属性的数量和类型等。因此,在比较大规模的对象时,equals方法的效率可能会显著降低。

为了提高equals方法的执行效率,可以考虑以下几种方法:

1)先比较两个对象的hashCode值,如果它们的hashCode值不同,则这两个对象不相等,可以直接返回false;

2)将equals方法的比较顺序调整,将属性值变化频率低的属性放在前面比较;

3)使用缓存,将对象的hashCode值缓存起来,避免重复计算。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

继承-菱形继承

继承 继承是类设计层次的复用 继承方式与访问限定符 限定了啥? 1.根据表中我们可以看到 基类的私有成员在子类不可见,但还是被继承了下来 2.根据继承方式和成员在基类的访问限定符小的那个来决定了子类访问基类成员的访问方式 例如如果是public继承&a…

甄云库存管理解决方案 ,助力企业库存高效运转起来

导语 近年来,在降低成本、提高工作效率和满足用户需求等多重压力下,许多企业也开始重视非生产物资的库存管理,如办公设备、劳保用品、电子设备、维修工具、实验耗材。这些物资往往品类繁多、采购频率较高,占用了企业大量的管理时…

quartus工具篇——PLL IP核的使用

quartus工具篇——PLL IP核的使用 1、PLL简介 PLL(Phase-Locked Loop,相位锁环)是FPGA中非常重要的时钟管理单元,其主要功能包括: 频率合成 - PLL可以生成比输入时钟频率高的时钟信号。频率分频 - PLL也可以输出分频后的较低频率时钟。减小时钟抖动 - PLL可以过滤输入时钟中…

内存映射学习笔记

文章目录 内存映射原理函数定义mmap函数munmap函数 注意事项应用进程间通信文件复制 匿名映射 内存映射原理 将磁盘中的文件,映射到内存,通过内存修改文件。 函数定义 mmap函数 操作映射区必须要有 读权限 munmap函数 首地址 长度一致。 注意事项 可…

第一章:STC:一种用于弱监督语义分割的简单到复杂框架

0.摘要 近年来,由于深度卷积神经网络(DCNNs)的发展,语义目标分割取得了显著的改进。训练这样一个DCNN通常依赖于大量具有像素级分割掩码的图像,并且在财务和人力方面标记这些图像非常昂贵。在本文中,我们提…

javascript 7种继承-- 原型式继承分析(4)

文章目录 概要继承的进化史技术名词解释原型式继承原型式继承1原型式继承2对比图 原型链继承 vs 原型式继承案列分析源代码解析效果图小结优点缺点 概要 这阵子在整理JS的7种继承方式,发现很多文章跟视频,讲解后都不能让自己理解清晰,索性自…

【前端学java】JAVA中的packge与import

packge与import示例 Java中,使用package关键字来声明一个类所属的包: package myapp;public class MyClass {// 类的实现... }上述代码中,MyClass类被声明为属于myapp的包。在其他的代码中使用该类时,需要使用完整的包名来引用它…

学习DT材质基础

Lambert材质和常用颜色属性 Maya材质的发光属性 Maya材质的光线跟踪属性 看不见阴影是因为背景用错材质了 MAYA矢量渲染 各向异性材料(看高光) 渐变材质 开启光线跟踪 表面着色器材质

微服务——Docker

docker与虚拟机的区别 首先要知道三个层次 硬件层:计算机硬件 内核层:与硬件交互,提供操作硬件的指令 应用层: 系统应用封装内核指令为函数,便于程序员调用。用户程序基于系统函数库实现功能。 docker在打包的时候直接把应用层的函数库也进行打包&a…

【GeoDa实用技巧100例】015:Geoda构建箱线图

文章目录 一、箱线图介绍二、Geoda制作箱形图三、箱形图与箱形地图的链接一、箱线图介绍 箱形图,也称箱线图(Box and Whisker Diagram)、箱图、盒须图、盒式图和盒形图等,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。箱形图是由美国著名统计学家图基在…

vue3-组件中的变化

1. 路由 1. 安装指令:npm i vue-routernext 2. 创建路由:createRouter2. 异步组件(defineAsyncComponent) defineAsyncComponent 是用于定义异步组件的函数。defineAsyncComponent 接受一个工厂函数作为参数,这个工厂…

opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)

什么是几何变换? 几何变换是计算机图形学中的一种图像处理技术,用于对图像进行空间上的变换,而不改变图像的内容。这些变换可以通过对图像中的像素位置进行调整来实现。 常见的几何变换包括: 平移(Translation&#x…

力扣热门100题之无重复字符的连续子串【中等】

题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子…

Java8实战-总结6

Java8实战-总结6 通过行为参数化传递代码对付啰嗦匿名类第五次尝试:使用匿名类第六次尝试:使用Lambda表达式第七次尝试:将List类型抽象化 真实的例子用Comparator来排序 通过行为参数化传递代码 对付啰嗦 人们不愿意用那些很麻烦的功能或概…

个微API,微信机器人开发

简要描述: 退出群聊 请求URL: http://域名地址/quitChatRoom 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wI…

Redis实战案例24-关注推送

1. Feed流实现方案 拉模式主要缺点,延迟问题,极端情况某个用户关注了成千上万的up主,每位up主又发布了十几条博客,此时拉模式的延迟就会很高; 推模式缺点也很明显,内存消耗太大,假设up主是千万级…

【idea工具】idea工具,build的时候提示:程序包 com.xxx.xx不存在的错误

idea工具,build的时候提示:程序包 com.xxx.xx不存在的错误,如下图,折腾了好一会, 做了如下操作还是不行,idea工具编译的时候,还是提示 程序包不存在。 a. idea中,重新导入项目,也还…

基于DNN深度学习网络的OFDM+QPSK信号检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................. Transmitt…

区块链实验室(11) - PBFT耗时与流量特征

以前面仿真程序为例,分析PBFT的耗时与流量特征。实验如下,100个节点构成1个无标度网络,节点最小度为5,最大度为38. 从每个节点发起1次交易共识。统计每次交易的耗时以及流量。本文所述的流量见前述仿真程序的说明:区块链实验室(3)…

页面设计—FlexContainer弹性容器组件详解

一、组件介绍 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局,可以与栅格布局结合使用。 二、样式介绍 三、如何使用 (1)找到FlexCo…