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

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

== 和 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、设计模式、消息队列等模块。

相关文章
|
4月前
|
存储 Java
|
7月前
equals方法中变量在前和在后的区别
equals方法中变量在前和在后的区别
140 0
|
算法 Java 索引
equals方法和hashCode方法之间的那些事(1.1)
equals方法和hashCode方法之间的那些事(1.1)
|
索引
9. 说说hashCode() 和 equals() 之间的关系?
9. 说说hashCode() 和 equals() 之间的关系?
76 0
9. 说说hashCode() 和 equals() 之间的关系?
|
存储 Java
详解“==”和equals的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
|
存储 Java
“==”和equals 最大的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
“==“和equals方法有什么区别(面试)
" == " 比较的是值 " == " 如果比较的是基本数据类型,比较的则是变量值 " == " 如果比较的为引用数据类型,比较的则是地址值
94 0
|
存储
"=="和 equals 方法究竟有什么区别?
"=="和 equals 方法究竟有什么区别?
135 0
|
Java
Java面向对象(13)--==操作符与equals方法
Java面向对象(13)--==操作符与equals方法
91 0