未對 equals 方法進行重寫,就是用於判斷引用數據類型的變數所指向的對象的地址是否相等,即是否指向同一個對象; == 對於基本數據類型的變數,比較的是變數存儲的值是否相等,而作用於引用類型的變數時,比較的是變數所指向的對象在記憶體中的地址值是否相等。 ...
equals
- 如果對 equals 方法進行重寫,那麼 equals 方法就是用於判斷引用數據類型的變數的值否相等;
- 如果沒有對 equals 方法進行重寫,那麼 equals 方法就是用於判斷引用數據類型的變數所指向的對象的地址是否相等,即是否指向同一個對象
==
- 對於基本數據類型的變數,比較的是變數存儲的值是否相等,
- 而作用於引用類型的變數時,比較的是變數所指向的對象在記憶體中的地址值是否相等。
首先看如下代碼:
分析
如下代碼:
public class EqualsDemo {
public static void main(String[] args){
int i = 3;
int j = 3;
System.out.println(i == j); // true
String str1= "hello";
String str2= "hello";
//聲明瞭一個引用類型的變數。
String str;
//通過 new String("hello") 產生一個對象,str 指向這個對象,str 即為這個對象的引用,str 存儲的就是它指向的對象在記憶體中的地址。
str = new String("hello");
String str3 = new String("hello");
String str4 = str3;
System.out.println(str.equals(str3)); // true
System.out.println(str == str3); // false
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str1 == str3); // false
System.out.println(str3.equals(str4)); // true
System.out.println(str3 == str4); // true
}
}
先來說說 ==
比較運算符
i == j
結果為 true,那我們可以理解為 ==
比較的是變數的值是否相等,但是 str == str3
結果卻是 false,為什麼呢?
因為在 Java 中分兩大數據類型,一種是基本數據類型,另一種是引用數據類型變數。基本數據類型就是指 byte,short,int,long,float,double,char,boolean
這8種數據類型,引用數據類型就是那些對象,數組這些。String 就是引用數據類型。
基本數據類型的變數直接存儲的變數值,所以用 ==
進行比較就是直接比較的變數的值,所以i == j
結果為 true,
而引用數據類型的變數存儲的不是其本身的值,而是其指向的對象在記憶體中的地址值。
str 和 str3 分別指向了兩個不同的對象,這兩個對象在記憶體中的地址值肯定是不同的,所以 str == str3
結果是 false;str1 和 str2 指向的是同一個對象,str3 和 str4 也是指向同一個對象,所以它們的比較結果都為 true。
所以可以得出個結論:==
對於基本數據類型的變數,比較的是變數存儲的值是否相等,而作用於引用類型的變數時,比較的是變數所指向的對象在記憶體中的地址值是否相等。
再來說 equals
所有繼承 Object 類的類都有 equals 方法。jdk 源碼中 Object 類的 euqals 方法是這樣實現的:
public boolean equals(Object obj) {
return (this == obj);
}
可以看出 Object 的 equals 方法其實就是通過 ==
運算符來比較兩個變數的,就是比較兩個變數所指向的對象是否相等。
但是 str.equals(str3)
結果卻為 true,這兩個變數分明是指向不同的對象啊,為什麼結果是 true 呢?
jdk 源碼中 String 類的 euqals 方法的具體實現:
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;
}
哦,原來 String 類重寫了 equals 方法,其是比較兩個字元串變數存儲的值是否相等,
所以上述代碼中兩個字元串變數通過 equals 方法比較的結果為 true。
綜上分析,就可以得出開頭對 equals 和 == 的總結。