Java 集合學習之——equals和==的使用
參考:
https://www.cnblogs.com/Eason-S/p/5524837.html
https://www.cnblogs.com/LittleHann/p/3690187.html
開始之前先做個定義:
==:
== 比較的是變數(棧)記憶體中存放的物件的(堆)記憶體地址,用來判斷兩個物件的地址是否相同,即是否是指相同一個物件。比較的是真正意義上的指標操作。
1、比較的是操作符兩端的運算元是否是同一個物件。
2、兩邊的運算元必須是同一型別的(可以是父子類之間)才能編譯通過。
3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為true,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。
equals:
equals用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。
String s="abce"是一種非常特殊的形式,和new 有本質的區別。它是java中唯一不需要new 就可以產生物件的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字串,在JVM內部發生字串拘留,即當宣告這樣的一個字串後,JVM會在常量池中先查詢有有沒有一個值為"abcd"的物件,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一物件,如果沒有,則在常量池中新建立一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個物件,即以這形式宣告的字串,只要值相等,任何多個引用都指向同一物件.
而String s = new String("abcd");和其它任何物件一樣.每呼叫一次就產生一個物件,只要它們呼叫。
也可以這麼理解: String str = "hello"; 先在記憶體中找是不是有"hello"這個物件,如果有,就讓str指向那個"hello".如果記憶體裡沒有"hello",就建立一個新的物件儲存"hello". String str=new String ("hello") 就是不管記憶體裡是不是已經有"hello"這個物件,都新建一個物件儲存"hello"。
然後整理了如下程式碼,執行完之後看結果:
package ids.autoview.tw.acconsys.test; public class StringTest { public static void main(String[] args) { String s = "hello"; String s1 = "hello"; String s2 = new String("hello"); String s3 = new String("hello"); System.out.println(s == s1); System.out.println(s == s2); System.out.println(s == s3); System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s2 == s3); System.out.println(s.equals(s1)); System.out.println(s.equals(s2)); System.out.println(s.equals(s3)); System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s2.equals(s3)); Person p1 = new Person("xm"); Person p2 = new Person("xm"); System.out.println(p1 == p2); System.out.println(p1.equals(p2)); System.out.println(s); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(p1); System.out.println(p2); } static class Person{ String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object obj) { Person temp = (Person)obj; if(temp.name.equals(this.name)){ return true; }else{ return false; } } } }
執行結果:
true
false
false
false
false
false
true
true
true
true
true
true
false
true
hello
hello
hello
hello
[email protected]
[email protected]
Process finished with exit code 0
總結如下:
1、==比較的是物件引用是否相同,如果相同則是true,否則是false.對於字串,如果不是通過new來建立的,那字串都會常量池中檢查是否已經有該字串,如果有,則直接指向該字串,如果沒有再在常量池中建立,對於new出來的字串,或者其他物件執行==的時候都是false;
2、equals用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷,如果一個類不對equals重寫,那麼等價於判斷==是true還是false.