溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中==和equals()的區(qū)別有哪些

發(fā)布時(shí)間:2021-11-09 11:14:31 來(lái)源:億速云 閱讀:172 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Java中==和equals()的區(qū)別有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

1. ==

== 是運(yùn)算符,用來(lái)判斷兩個(gè)值是否相等,==可以使用在基本數(shù)據(jù)類型變量引用數(shù)據(jù)類型變量

1.1 基本數(shù)據(jù)類型

Java基本數(shù)據(jù)類型共有八種,可以分為三類

  • 字符類型char

  • 布爾類型boolean

  • 數(shù)值類型byte、short、int、long、float、double

這里有個(gè)例外,boolean不參與數(shù)值運(yùn)算

int a1 = 10;
int a2 = 10;
System.out.println(a1==a2);  //true

float a3 = 5.0f;
float a4 = 5.0f;
System.out.println(a3==a4);  //true

……

上面給出幾組示例,相同數(shù)據(jù)類型可以相互比較不用多說(shuō)了,那么不同數(shù)據(jù)類型呢?

int a1 = 10;
byte b1 = 10;
System.out.println(a1==b1);  //true

char c1 = 'A';
int c2 = 65;
System.out.println(c1 == c2);  //true

int a1 = 10;
double d1 = 10.0d;
System.out.println(a1==d1);  //true

int a1 = 10;
char e1 = 10;
System.out.println(a1==e1);  //true

可以看到,在基本數(shù)據(jù)類型的范圍內(nèi),不同數(shù)據(jù)類型也是可以直接比較的

如果比較的是基本數(shù)據(jù)類型,就是判斷兩個(gè)保存的數(shù)據(jù)是否相同(不一定類型相同)

1.2 引用數(shù)據(jù)類型

這里先寫一個(gè)Student類,用于參考

public class Student {
    public String name;
    public int age;

    public Student(){}

    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
}

實(shí)例化兩個(gè)Student對(duì)象,判斷是否相等

Student student1 = new Student("Tom", 18);
Student student2 = new Student("Tom", 18);
System.out.println(student1==student2);  //false

注意,這里出現(xiàn)了示例中的第一個(gè)false??梢钥吹剑词官x的值是相同的,但使用==判斷的結(jié)果為false,這是因?yàn)閮蓚€(gè)對(duì)象在內(nèi)存中不指向同一地址。

如果比較的是引用類型,就是比較兩個(gè)變量是否代表同一對(duì)象實(shí)體,也就是是否指向同一地址

1.3 小結(jié)

==是運(yùn)算符
可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中
如果比較的是基本數(shù)據(jù)類型,就是判斷兩個(gè)保存的數(shù)據(jù)是否相同,不一定類型相同
如果比較的是引用類型,就是比較兩個(gè)變量是否代表同一對(duì)象實(shí)體,也就是是否指向同一地址

2. equals

equals()是方法,只能用于引用數(shù)據(jù)類型

還是使用上面介紹到的Student對(duì)象,如果使用equals比較,那么?

Student student1 = new Student("Tom", 18);
Student student2 = new Student("Tom", 18);
System.out.println(student1.equals(student2));  //false

答案還是false,我們可以看一下在此處使用的equals的源碼

Java中==和equals()的區(qū)別有哪些

使用的正是Object中的equals()方法(繼承),而Object中的equals()方法也是使用的==進(jìn)行的比較

Object類中equals()和==的作用相同

誒,部分同學(xué)可能想說(shuō)了,這個(gè)equals()和我們平時(shí)用的不太一樣啊,平時(shí)用的equals()好像是用來(lái)比較數(shù)值的。這里我們拿String類來(lái)舉例。

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

使用==比較,不出意外是false。而這里使用equals(),得到的結(jié)果是true。我們看一下這里的equals()源碼(Java8版本)

Java中==和equals()的區(qū)別有哪些

可以看到,String類中的equals()重寫了Object類中的equals(),這里側(cè)重于具體的數(shù)值比較(我們?nèi)粘J褂弥幸彩歉M容^具體的數(shù)值)。分析一下源碼,這里先使用==進(jìn)行比較,然后判斷是否為String的一個(gè)示例,判斷長(zhǎng)度是否相等,最后挨個(gè)判斷字符是否相等。

源碼的大部分程序都比較好理解,有些人比較迷惑這里的強(qiáng)制轉(zhuǎn)換(如下圖),既然前一句判斷了是否為String類的實(shí)例,后一句為什么還要強(qiáng)轉(zhuǎn)?這是因?yàn)椋贘ava中,代碼從編寫到執(zhí)行要經(jīng)歷兩個(gè)過(guò)程——編譯和執(zhí)行,在執(zhí)行時(shí),程序判斷了實(shí)參是否為String類的實(shí)例對(duì)象,之后不再需要強(qiáng)轉(zhuǎn);但是在編譯中,即使經(jīng)歷了instanceof判斷,編譯器還是會(huì)始終把傳進(jìn)來(lái)的參數(shù)當(dāng)作Object類型,而Object類型是沒(méi)有value屬性的,會(huì)直接報(bào)錯(cuò)。所以在這里如果不強(qiáng)轉(zhuǎn),編譯都通不過(guò),更不用說(shuō)執(zhí)行了。

Java中==和equals()的區(qū)別有哪些

類似的,我們可以寫出Student類中重寫的equals()方法。

不過(guò)現(xiàn)在因?yàn)轭愂褂玫姆浅6?,一方面是因?yàn)槊總€(gè)類都添加比較繁瑣,另一方面我們可能寫的可能不夠健壯,這里提供兩種方式自動(dòng)提供equals()的重寫

IDEA編譯器的快捷鍵“alt + insert”,選擇如下圖的選項(xiàng)

Java中==和equals()的區(qū)別有哪些

選擇需要添加到equals()的屬性

Java中==和equals()的區(qū)別有哪些

可以看到自動(dòng)生成的程序

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age &&
        Objects.equals(name, student.name);
}

導(dǎo)入lombok包,加入Data注解

@Data
public class Student {
    public String name;
    public int age;

    public Student(){}

    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
}

可以看到重寫了Object類中的equals()方法

Java中==和equals()的區(qū)別有哪些

3. 總結(jié)

	/**
     * ==是運(yùn)算符,equals是方法
     * 1. ==
     *      可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中
     *      如果比較的是基本數(shù)據(jù)類型,就是判斷兩個(gè)保存的數(shù)據(jù)是否相同,不一定類型相同
     *      如果比較的是引用類型,就是比較兩個(gè)變量是否代表同一對(duì)象實(shí)體,也就是是否指向同一地址
     *
     * 2. equals
     *      只能適用于引用數(shù)據(jù)類型
     *      Object類中equals()和==的作用相同
     *      像String、Data、File、包裝類等中的equals都是重寫了Object類中的equals()方法,比較的是實(shí)體內(nèi)容是否相同
     */

看完了這篇文章,相信你對(duì)“Java中==和equals()的區(qū)別有哪些”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI