首页 > 其他分享 >终结篇:==和equals有什么区别?

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

时间:2023-12-15 16:12:14浏览次数:27  
标签:obj String 区别 终结 Object equals Integer return

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

1.典型回答

对于 Object 来说,其 equals 方法底层实现就是“==”,如下 JDK 的 Object 源码如下:

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

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

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

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

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 方法
}
@IntrinsicCandidate
public 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 中的引用比较重写成了值比较了。

2.考点分析

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

3.知识扩展

如果我们自定义一个类,并且想和 Integer 或 String 中的 equals 一样,用其对比值而非引用是否相同的实现代码如下:

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 都是这样。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:obj,String,区别,终结,Object,equals,Integer,return
From: https://www.cnblogs.com/vipstone/p/17903575.html

相关文章

  • @Resource和@Autowired的区别
    都是用来自动装配的,都可以放在属性字段上@Autowired是通过ByType的方式实现,必须要求这个对象存在,如果找不到此对象则提示空指针异常!@Resource是默认通过ByName的方式实现,如果找不到名字,则通过ByType实现,如果两个都找不到则提示异常!执行顺序不同:@Autowired是通过By......
  • pandas.array() 与 numpy.array() 函数的区别
    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.array.html#pandas.array`pandas.array()`和`numpy.array()`都是用于创建数组的函数,但它们在一些方面有所不同¹²:1.**数据类型**:`numpy.array()`可以创建多维数组,而`pandas.array()`主要用于创建Pandas的`Se......
  • Synchronized 和 Lock 的区别和使用场景
    Synchronized和Lock的概念Synchronized 是Java并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized的目的是一次只允许一个线程进入由他修饰的代码段,从而允许他们进行自我保护。Synchronized很像生活中的锁例子,进入由Synchronized保护的代码区首先需要获......
  • C# 加深印象之 Task.Run和new Task的区别
    publicasyncTaskTest(){vartask=AAA();Log.Info("调用AAA");awaitTask.Delay(2000);Log.Info("等待2秒任务尚未执行完毕");awaittask;//等待任务完成Log.Info("等待AAA......
  • 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    联系:1.Linux的内核源代码和Linux的应用程序都可以自由获得,因此很多公司组织开发了属于自己的Linux发行版。2.基本上可以分为三大系类:Slackware、RedHat、Debian3.每个系列最具代表性的商业服务器级的发行版,分别是SUSELinuxEnterprise;RedHatEnterpriseLinux;UbuntuServ......
  • js (for in)和(for of)区别
    for...in语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。for...of语句在可迭代对象(包括Array,Map,Set,String,TypedArray,arguments对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句参考:https://developer.mozilla.org......
  • NX 2306 建模-倒圆角 和 圆倒角的区别
        图右画法(类似于螺栓螺母头)的步骤(也可以用扫掠,就是麻烦一点)step1:在需要倒的起始面上画起始圆,草图step2:拉伸该圆,布尔相交,并根据图示,选择对应角度。 ......
  • IaaS、PaaS、SaaS的区别
    云计算,主要有三种服务模式,它们分别是IaaS、PaaS、SaaS。云计算有以下⼏个层次的服务:基础设施级服务(IaaS),平台级服务(PaaS)和软件级服务(SaaS)。这⾥所谓的层次,是分层体系架构意义上的“层次”。1.基础设施即服务【基础设施层】(IaaS:InfrastructureasaService)提供给使......
  • TCP协议 和 UDP协议 的区别 (三次握手/四次挥手)
    TCP协议拓展:FTP:(File Transfer Protocol)文件传输协议FIle协议:访问本地文件Webscoket:网络通信协议;主动给客户端发送协议FTP:文件传输协议①重点:面试重点:TCP、UDP协议区别UDP(UserDatagramProtocol)......
  • python 定义类的时候的 A(object) 和 A 区别是什么?
    在Python中,A(object)和A的区别涉及到类的继承和类的定义方式。继承的区别:A(object)表示A类继承自object类。这是在Python2中引入新式类的写法,是显式地继承自基类object。在Python3中,所有的类都隐式继承自object,因此这两者在大多数情况下是等效的。A表示......