==與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