java 中的equals()示例代码

news2025/7/14 15:37:37

Java中的equals()是十分重要的,和==要区别开来

简述

public booleanequals(Object obj)

作用:判断其他的对象是否和该对象相等

其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.

简单示例

equals()方法在object类中定义:

publicboolean equals(Object obj) {

return (this == obj);

}

上边我们很明显看出是比较2个对象引用地址是否相同,比如以下两个对象animal1animal2,引用不同的对象,因此用==或equals()方法比较的结果都为false;而animal1animal3变量引用同一个Dog对象,因此用==或者equals()方法比较的结果都为true.

Animal animal1=new Dog();

Animal animal2=new Cat();

Animal animal3=animal1;

animal1==animal2 (false)

animal1.equals(animal2)(false)

animal1==animal3(true)

animal1.equals(animal3)(true)

但是我们平时在调用String、Integer等封装类型时的equals方法时是比较的内容是否一致而不是地址一致,如果是地址一致,那所有的String比较都是相等的,所以JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

如下简单示例:

public class Demo {
    public static void main(String[] args) {
        Integer int1=new Integer(1);
        Integer int2=new Integer(1);
        System.out.println(int1==int2); // false,因为不同对象
        System.out.println(int1.equals(int2));  // true

        String str1=new String("hello");
        String str2=new String("hello");
        System.out.println(str1==str2); // false
        System.out.println(str1.equals(str2));  // true
    }
}

自定义类,重写equals()方法

当然,可以自定义覆盖object类的equals()方法,重新定义比较规则。比如,下面Person类的equals()比较规则为:只要两个对象都是Person类,并且他们的属性name都相同,则比较结果为true,否则返回false

Person类

public class Person{
    private String name;

    public Person(String name)
    {
        this.name=name;
    }

    public boolean equals(Object o)
    {

        if (this==o) return true;
        /*
         * instanceof
         * 作用是:测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
         * instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
         * */
        if (!(o instanceof Person)) return false;

        final Person other=(Person)o;
        if (this.name.equals(other.name))
            return true;
        else
            return false;
    }
}

main函数所在主类:

public class Demo {
    public static void main(String[] args) {
        Person A = new Person("test");
        Person B = new Person("test");
        System.out.println(A == B); // false
        System.out.println(A.equals(B));  // true
    }
}

重写equals()方法注意内容

要注意满足离散数学上的特性:

1、自反性 :对任意引用值X,x.equals(x)的返回值一定为true.

2 、对称性: 对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;

3 、传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true

4、 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变

5 、非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

示例(判断两个Map集合是否相等)

Demo

import java.util.HashMap;
import java.util.Map;

public class Demo {
    public static void main(String[] args) {
        Map<String,Object> mapA = new HashMap<>();
        Map<String,Object> mapB = new HashMap<>();

        mapA.put("a",123);
        mapA.put("b",6.66);
        mapA.put(null,777);
        mapA.put(null,"888");
        mapA.put("c","999");

        mapB.put("a",123);
        mapB.put("b",6.66);
        mapB.put(null,777);
        mapB.put(null,"888");
        mapB.put("c","999");

        System.out.println(mapA.equals(mapB)); // true

        Map<String,Object> mapC = new HashMap<>();
        System.out.println(mapA.equals(mapC)); // false
    }
}

示例(判断两个Integer是否相等)

比较数值相等时,建议使用equals()

public class Demo {
    public static void main(String[] args) {
        Integer i_128_a = -128;
        Integer i_128_b = -128;

        Integer i127_a = 127;
        Integer i127_b = 127;
        System.out.println(i_128_a == i_128_b); // true
        System.out.println(i127_a == i127_b); // true

        // 可以看到,当Integer表示的值在[-128 ~ 127]之间,使用==时能达到我们的预期的。
        // IntegerCache缓存范围是[-128~127],可以修改修改integer的缓存范围,但是治标不治本
        //可是一旦超过这个范围,结果就不是我们想要的了,如下:

        Integer i_129_a = -129;
        Integer i_129_b = -129;

        Integer i128_a = 128;
        Integer i128_b = 128;
        System.out.println(i_129_a == i_129_b); // false
        System.out.println(i128_a == i128_b); // false

        
        System.out.println("使用equals()方法");
        System.out.println(i_128_a == i_128_b); // true
        System.out.println(i127_a.equals(i127_b)); // true
        System.out.println(i_129_a.equals(i_129_b)); // true
        System.out.println(i128_a.equals(i128_b)); // true
    }
}

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

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

相关文章

代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

打卡第22天&#xff0c;平衡二叉树&#xff0c;难&#xff0c;难&#xff0c;难。 今日任务 235.二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点 235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百…

BeanFactory接口

目录 概述 接口方法 BeanFactory重要的子类 概述 BeanFactory是容器的顶层接口,也是spring最核心的容器,管理bean的核心方法都在BeanFactory接口中定义。像ApplicationContext接口,ConfigurableApplicationContext接口都间接继承BeanFactory接口,既ApplicationContext调用ge…

Wwise集成到unreal

1、Wwise集成到Unreal 1.1 安装必要的软件 安装unreal 5.1&#xff1b;安装Audiokinetic Launcher&#xff1b;集成版本是Wwise 2021.1.12.7973。Audiokinetic Launcher下载地址&#xff1a; https://www.audiokinetic.com/zh/thank-you/launcher/windows/?refdownload&pl…

Go语言学习的第三天--下部分(Gin框架的基础了解)

每天都会分享Go的知识&#xff0c;喜欢的朋友关注一下。每天的学习分成两部分基础&#xff08;必要的&#xff0c;基础不牢地动山摇&#xff09;&#xff0c;另一部分是Go的一些框架知识&#xff08;会不定时发布&#xff0c;因为小Wei也是一名搬砖人&#xff09;。但是可以保证…

哪个牌子的蓝牙耳机最好?质量最好的蓝牙耳机排行榜

随着蓝牙耳机的发展越来越快速&#xff0c;蓝牙耳机市场涌现出五花八门的产品&#xff0c;外观不同、性能不一。最近看到很多人问&#xff0c;哪个牌子的蓝牙耳机最好&#xff1f;接下来&#xff0c;我来给大家推荐几款质量最好的蓝牙耳机排行榜&#xff0c;一起来看看吧。 一…

电商使用CRM系统有什么好处,如何选择

数据显示&#xff0c;使用电商CRM客户管理系统后&#xff0c;企业销售额提高了87%&#xff0c;客户满意度提高了74%&#xff0c;业务效率提高了73%。要在竞争激烈的电商市场取得成功&#xff0c;与目标受众的有效沟通是有效的方法。下面说说什么是电商CRM系统&#xff1f;电商C…

如何使用ArcGIS生成剖面图(附练习数据)

1、概述地形剖面图指沿地表某一直线方向上的垂直剖面图&#xff0c;以显示剖面线上断面地势起伏状况。能够制作剖面图的软件有很多&#xff0c;作为GIS行业的老大&#xff0c;ArcGIS当然也是可以的&#xff0c;这里给大家详细介绍一下ArcGIS中制作剖面图的知识&#xff0c;希望…

2.详解DEBUG模式

文章目录DEBUG模式解决了两个问题四种开启DEBUG的方式第一种第二种第三种第四种DEBUG的PIN码可以在浏览器端调试代码使用&#xff08;不推荐使用&#xff0c;了解就可以&#xff09;DEBUG模式解决了两个问题 flask代码中如果出现了异常&#xff0c;我们在浏览器中不会提示具体…

图床搭建,使用typora上传

1. 准备gitee作为图床的仓库 新建仓库 准备仓库的私人令牌&#xff0c;后面配合使用 点击个人设置——》私人令牌 注意私人令牌&#xff0c;复制保存好&#xff0c;后面不能再看了 2. 准备PicGO&#xff0c;并进行相关配置 PicGo官方下载链接 下载安装好node.js,下载网址 安…

【银行测试】必看的四类题型:这可是最经典的一套题目了

目录&#xff1a;导读 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 四、测试案例设计题 金三银四面试面对大厂面试官提问&#xff0c;如何回答&#xff1a;花3天背完这100道软件测试面试题&#xff01;银行测试的offer还不是手…

【GO】K8s 管理系统项目34[Linux环境–应用部署]

K8s 管理系统项目[Linux环境–应用部署] 1. 启动数据库 1.1 配置yum仓库 rm -f /etc/yum.repos.d/*.repo wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/…

Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能

前言 其实想要实现功能很简单&#xff0c;就是在一张图片上监听鼠标滑轮滚动的事件&#xff0c;然后根据上滚还是下滚实现图片的缩放。 效果&#xff1a; 注&#xff1a;该配图使用《漫画|有趣的了解一下赋值、深浅拷贝》文章图片&#xff0c;不存在侵权问题。 实现思路 在…

规划数据指标体系方法(下)——新海盗模型

前面已经跟大家分享了规划数据指标体系的两种方法—— OSM 和 UJM 模型&#xff0c;分别从目标-策略以及用户旅途的角度阐述了规划数据指标体系的过程。今天我来跟大家分享最后一种规划数据指标体系的方法——新海盗模型。 了解新海盗模型 海盗模型&#xff0c;即 AARRR 模型&…

脑机接口科普0014——大脑

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 在提到脑机接口的时候&#xff0c;不得不提到大脑。 在我们的思维意识中&#xff0c;植物是没有大脑的。这是正确的。 在我们的思维意识中&#xff0c;动物都是有大脑的。 但是很明显&#xff0c;动物都有大…

程序员看过都说好的资源网站,你值得拥有。

程序员必备的相关资源网站一.技术社区1.GitHub2.Gitee&#xff08;码云&#xff09;3.稀土掘金4.OSCHINA开源中国5.CSDN6.博客园7.SegmentFault&#xff08;思否&#xff09;8.Stack Overflow9.Golang中文社区10.ChinaUnix11.51CTO12.Ruby China二.技术教程1.Devdocs2.码农教程…

案例解读| 从集中告警平台发展趋势看城商行如何落地数字化转型(二)

上期我们以具体案例入手&#xff0c;分享了集中告警平台到底应该与集中监控平台解耦还是紧绑定等问题。这一期依旧从具体案例切入&#xff0c;跟大家一起探索下告警与服务台的对接过程&#xff0c;以及这个过程中可能产生的问题。上期内容&#xff0c;一键回顾不迷路→案例解读…

17万字 JUC 看这一篇就够了(二) (精华)

今天我们继续来学习并发编程 17万字 JUC 看这一篇就够了(一) (精华) 线程池 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作 线程池作用&#xff1a; 降低资源消耗&#xff0c;减…

网络工程师面试题(面试必看)(1)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.正题 1.TCP UDP协议的区别

YARN基本架构

主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成&#xff0c;如图所YA示。 ResourceManager&#xff08;RM&#xff09; RM是全局资源管理器&#xff0c;负责整个系统的资源管理和分配 主要由两个组件构成&#xff1a;Scheduler调度器和应用程序…

ZYNQ嵌入式学习(5)

UARTUART简介发送FIFO接收FIFO模式切换寄存器操作中断和状态寄存器发送数据轮询中断接收数据轮询中断实验&#xff1a;串口中断数据环回UART简介 不需要了解时序。 UART是全双工异步收发的&#xff0c;没有时钟。 UART的操作通过配置和模式寄存器控制。 UART由独立的接受和发送…