equals和==詳解
equals和==小結
1. ==簡單介紹
==
比較的是兩個比較物件的記憶體地址是否相同,當兩個物件的記憶體地址相等時,返回 true,否則返回 false;
解釋:
==
比較的是兩端運算元(通常是物件的引用)是否是同一個物件,即在堆中是否有相同的記憶體地址,比較的是記憶體地址的值;- 基本資料型別中,比較值是否相等,如
int i =10;
,
double d= 10.0;(i==d)
為true
; - 兩邊的運算元必須是同一型別,或者父子類,否則不能通過編譯
2. equals
equals
比較的是兩個物件的實際內容是否相等,所有物件都適用,但是不適用於 基本型別,基本型別使用 ==
和 !=
即可。
以下為 Object
類中 的equals
原始碼,可以發現equals
方法預設返回的還是 ==
的判斷(即是否為同一物件),由於所有的類都繼承java.lang.Object
equals
方法時,若沒有重寫equals
方法,則equals
和==
沒有區別;
public boolean equals(Object obj) {
return (this == obj)//注意
}
3. String和自己建立的類
String 型別有兩種初始化方法
①:String str = new String("xx");
②String str2 = "xxx";
這兩種方法有著很大的不同,先看第一種,使用 new 來初始化 String 類,與其他普通物件沒有區別,都是在堆中開闢一段記憶體空間,儲存字串 “xx”,str 指向此記憶體地址;
第二種方法,首先會在 JVM 內部發生字串拘留,即當宣告這樣的一個字串後,JVM 會在常量池中先查詢有沒有一個值為 “xxx” 的物件,如果有,就會把它賦給當前引用,如果沒有,則在常量池中新建立一個 “xxx” 物件,當下一次還有使用這種方法初始化字串為 “xxx”時,會直接將此字串的引用執行之前的 “xxx” 物件,此時多個引用指向同一個物件
以下是使用 == 比較 String 物件
@Test
public void test1(){
String str11 = new String("初始化字串");
String str12 = new String("初始化字串");
String str21 = "初始化字串";
String str22 = "初始化字串";
//使用 == 比較使用 new 關鍵字初始化的字串物件是否為同一物件
System.out.println(str11==str12);// false 非同一物件
//使用 == 比較使用直接賦值初始化的字串物件是否為同一物件
System.out.println(str21==str22); // true 同一物件
}
String 使用 equals 比較
public void test2(){
String str11 = new String("初始化字串");
String str12 = new String("初始化字串");
String str21 = "初始化字串";
String str22 = "初始化字串";
//使用 equals 比較使用 new 關鍵字初始化的字串物件 內容 是否相等
System.out.println(str11.equals(str12));// true 內容相等
//使用 equals 比較使用直接賦值初始化的字串物件 內容 是否相等
System.out.println(str21.equals(str22)); // true 內容相等
//使用 equals 比較使用兩種不同初始化的字串物件 內容 是否相等
System.out.println(str11.equals(str21));// true 內容相等
}
因為 String 類重寫了 equals 方法,所以使用 equals 比較時,比較的是實際內容是否相等,以下為 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 方法
class value {
int i;
}
@Test
public void test3() {
//例項化兩個自定義類物件
value v1 = new value();
value v2 = new value();
//將兩個物件的成員變數賦相同的初值
v1.i = v2.i = 10;
System.out.println(v1.equals(v2));//false
}
因為自定義的類 value 未覆蓋 Object 的 equals 方法,所以使用 equals 預設返回的是 == 的比較結果。