文章来源:https://ethereum.blog.csdn.net/article/details/119579521?spm=1001.2014.3001.5506


== 和equals()最大的区别是:一个是运算符,一个是方法。


==

【1】如果比较的对象是基本数据类型,则比较数值是否相等

【2】如果比较的是引用数据类型,则比较的是对象的内存地址是否相等

因为Java只有值传递,所以对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址


equals()

用来比较两个对象的内容是否相等,不能比较基本数据类型

equals()方法存在于Object类中,而Object类是所有类的直接或间接父类

Object类equals()方法:

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

equals()方法存在两种使用情况:

【1】类没有覆盖 equals()方法

通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Object类equals()方法。

Object类中equals方法源码:

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

【2】类覆盖了 equals()方法

一般我们都覆盖 equals()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即认为这两个对象相等)。

举个栗子:

public class EqualsDemo {
    public static void main(String[] args) {
        String a = new String("ab");
        String b = new String("ab");
 
        String aa = "ab";
        String bb = "ab";
        
        System.out.println("aa==bb: " + (aa == bb));
        System.out.println("a==b: " + (a == b));
        System.out.println("a.equals(b): " + (a.equals(b)));
        System.out.println("42 == 42.0 : " + (42 == 42.0));
    }
}

aa==bb: true
a==b: false
a.equals(b): true
42 == 42.0 : true

说明:

  • String中的 equals方法是被重写过的,因为 Object的 equals方法是比较的对象的内存地址,而 String的 equals方法比较的是对象的值
  • 当创建 String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String对象

String类中的equals方法源码:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

  • equals方法不能用于判断基本数据类型的变量,如只能用来判断两个对象是否相等。

  • 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。