初級回答:
== 判斷的是位址是否相同,equals判斷的是值是否相同。
中級回答:
== 在基本類型中, == 比較的是值是否相同,例如:int a = 1; int b = 2; a==b比較的是1和2的值。
== 在引用類型中(引用類型是類類型、接口類型、數組類型), == 比較的是位址是否相同,例如String c = new String(“李四”); 和 String d = new String(“李四”); 他們的比較c == d比較的是c和d的位址引用是否相同,這裡很明顯c和d的位址引用是不相同的,因為是兩個不同的對象。
進階回答
首先來看equals的源碼,源碼中的注釋是我添加的,我覺得通過注釋就可以很簡單的明白equals方法中的邏輯了吧,背景圖檔是我idea的背景圖,有想要的可以私信我,嘿嘿。。。
public boolean equals(Object anObject) {
//判斷位址是否相同,如果位址相同則直接傳回true,如果位址不相同再去判斷值是否相同
if (this == anObject) {
return true;
}
//首先判斷傳進來的類是否是String類的子類,不懂instanceof函數可以百度
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//判斷兩個資料長度是否相同,如果長度相同則判斷每一位字元是否相同,長度不同則直接傳回false
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
//判斷每一位字元是否相同,如果有一位字元不相同則傳回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
通過源碼可以看到equals方法中首先判斷的是位址是否相同,如果位址相同則直接傳回為true,如果位址不相同則再判斷值是否相同。這裡首先說明一下這段equals源碼是在String類中的,如下圖。
就是說隻有String類型的使用equals方法才能先比較位址是否相同,如果位址不同則再比較值是否相同,那麼equals在對象類型或者數組類型中有沒有這種比較邏輯呢,我們看圖。
class Student {
public Student(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Student s1 = new Student("張三");
Student s2 = new Student("張三");
System.out.println(s1.equals(s2)); // false
char [] q = {1,2,3};
char [] w = {1,2,3};
System.out.println(q.equals(w)); //false
我們執行個體了兩個學生對象,然後對象name都指派為“張三”,而我們也建立了兩個數組對象,裡面都是1、2、3,這樣看來如果用equals方法的話,應該都為true才對,但是我們的結果都為false,這是為什麼呢,讓我們點選對象或者數組調用的equals方法中去看看,如圖。
我們可以看到對象和數組調用的equals方法都是Object類中的方法,而且Object類中的方法隻有一個對比位址的邏輯,沒有對比值的邏輯,是以如果我們沒有重寫equals方法的話,對象和數組都是用的Object類中的方法都是比較的位址,如果我們重寫equalse的話才可以在equals方法中寫比較值的邏輯,而String類型的equals方法本身就有比較值的邏輯,是以我們平時基本類型比較值的時候使用 == ,String類型比較值的時候使用equalse,如果要比較兩個對象是否相等直接使用equalse的話比較的是兩個對象的位址是否相等。
總結
如果大家想了解更多的有關JAVA方面的面試題與答案詳解請搜尋關注我的微信公衆号《小奇JAVA面試》裡面每天都會更新JAVA面試題,希望能夠幫助到大家。