当前位置:首页 > 科技  > 软件

终结篇:==和equals有什么区别?

来源: 责编: 时间:2023-12-15 09:50:14 376观看
导读== 和 equals 有什么区别?这个问题本身不难,但是被问到的频率很高,且大部分人的回答都不够全面,让人听了有种“恨铁不成钢”的感觉,所以今天咱们就来好好聊聊这个问题。1.典型回答对于 Object 来说,其 equals 方法底层实现

== 和 equals 有什么区别?这个问题本身不难,但是被问到的频率很高,且大部分人的回答都不够全面,让人听了有种“恨铁不成钢”的感觉,所以今天咱们就来好好聊聊这个问题。E6i28资讯网——每日最新资讯28at.com

1.典型回答

对于 Object 来说,其 equals 方法底层实现就是“==”,如下 JDK 的 Object 源码如下:E6i28资讯网——每日最新资讯28at.com

public boolean equals(Object obj) {return (this == obj);}

也就是说,对于 Object 对象来说,equals 和 == 都是一样的,都是比较对象的引用是否相同。但是,在 JDK 中的其他类中通常会重写 equals 以实现具体的值比较,例如 Integer 中的 equals 和 String 中的 equals 等,如下源码所示。 Integer 中的 equals 实现源码如下:E6i28资讯网——每日最新资讯28at.com

public boolean equals(Object obj) {if (obj instanceof Integer) {    return value == ((Integer)obj).intValue();}return false;}

从上述源码可以看出,Integer 中会先将 Integer 对象转换成基础类型 int 值来进行比较,所以此时就不再是对比两个对象的引用了,而是对比两个对象的值是否相等。 String 中的 equals 实现源码如下:E6i28资讯网——每日最新资讯28at.com

public boolean equals(Object anObject) {if (this == anObject) { // 引用相同返回 true,引用相同,那么值肯定相同了    return true;}return (anObject instanceof String aString)&& (!COMPACT_STRINGS || this.coder == aString.coder)&& StringLatin1.equals(value, aString.value); // equals 为下面的 equals 方法}@IntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {    if (value.length == other.length) {        for (int i = 0; i < value.length; i++) { // 循环每个字符对比,本质是值比较            if (value[i] != other[i]) {                return false;            }        }        return true;    }    return false;}

从 String 中的 equals 中可以看出,它和 Integer 一样,是将 Object 中的引用比较重写成了值比较了。E6i28资讯网——每日最新资讯28at.com

2.考点分析

所以,对于 Object 来说,== 和 equals 都是一样的,都是用来对比两个对象的引用是否相同的,而其他 Java 中的类中,如 String 或 Integer 等,通常都会重写 equals 让其变为比较具体的值是否相同,而非引用是否相同。 所以,我们通常会使用 == 来对比两个对象的引用是否相同,而使用 equals 对比两个值是否相同(前提条件是重写了 equals 方法)。E6i28资讯网——每日最新资讯28at.com

3.知识扩展

如果我们自定义一个类,并且想和 Integer 或 String 中的 equals 一样,用其对比值而非引用是否相同的实现代码如下:E6i28资讯网——每日最新资讯28at.com

public class Person {    private String name;    private int age;    // 忽略构造方法和 Getter、Setter 方法......    @Override    public boolean equals(Object obj) {        if (this == obj) {            return true;        }        if (obj == null || getClass() != obj.getClass()) {            return false;        }        Person other = (Person) obj;        return this.age == other.age && this.name.equals(other.name);    }}

小结

对于 Object 来说,equals 是用 == 实现的,所以二者是相同的,都是用来比较两个对象的引用是否相同的,但 Java 中的其他类,都会重写 equals 让其变为值比较,而非引用比较,如 Integer 和 String 都是这样。E6i28资讯网——每日最新资讯28at.com


E6i28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-46339-0.html终结篇:==和equals有什么区别?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 7k Star,一款开源的 Kafka 管理平台,功能齐全、页面美观!

下一篇: Shortcuts-Android应用程序的快捷方式

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top