==與equals的區別
我們先看Demo
String str = "abc";
String str1 = "abc";
String abc = new String("abc");
String abc1 = new String("abc");
然后我們使用==和equals挨個輸出
System.out.println(str==str1);// true
System.out.println(abc==abc1);//false
這里 str==str1,結果為true,因為String str = "abc"在編譯的時候,jvm將abc放入常量池,并在常量池中創建該常量的地址,然后將str去指向這個常量,當我們執行String str1 = "abc"的時候,會去常量池中尋找有沒有abc這個常量,如果有,則將str1指向它,沒有就創建,所以str1和str都指向常量池中的abc,故記憶體地址相同,
而在 String abc = new String("abc")中,首先會在堆記憶體中去開辟一個空間去存盤abc,當我們再new物件的時候,還會再去開辟,所以二則的記憶體地址不相同,故回傳false
然后再看equals輸出:
System.out.println(abc.equals(abc1));// true
System.out.println(str.equals(abc));// true
當我們使用equals時,從上面講的,可以知道abc與abc1,str與abc的記憶體地址并不相同,其在值上是相同的,那么可以得出結論equals會用==比較兩個型別在記憶體中的地址一不一樣,如果一樣,則直接回傳true,如果不一樣,則直接往下走,再判斷是否為string型別,如果不是,則強轉為string型別,再將字串陣列拆分為單個字符,一一比較,有一個不相同,則回傳false,否則回傳true
總結:
==對于基本型別,比較的是值,但對于參考型別,比較的是記憶體地址
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會用==比較兩個型別在記憶體中的地址一不一樣,如果一樣,則直接回傳true,如果不一樣,則直接往下走,再判斷是否為string型別,如果不是,則強轉為string型別,再將字串陣列拆分為單個字符,一一比較,有一個不相同,則回傳false,否則回傳true
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/380182.html
標籤:Java
上一篇:Java多執行緒學習隨記
