==的分析
1、對於基本資料類型,比較的是他們的具體內容是不是一樣,跟他們的內存地址無關。
舉例:
public class Test{ public static void main(String[] args) { int i = 10; double j = 10.0; float m = 10.0f; char k = 10; boolean b = true; System.out.println(i == j); System.out.println(i == m); System.out.println(m == k); System.out.println("*******************"); //System.out.println(i == b); 很明显,布尔型不能和其他基本数据类型比较,编译报错. System.out.println(System.identityHashCode(i)); System.out.println(System.identityHashCode(j)); System.out.println(System.identityHashCode(m)); System.out.println(System.identityHashCode(k)); System.out.println(System.identityHashCode(b)); } }
輸出:
true true true ******************* 366712642 1829164700 2018699554 1311053135 118352462
相關影片教學推薦:java免費影片教學
分析:
①根據比較的結果和記憶體位址來看,內容一樣,記憶體位址不一樣,但回傳的結果都是true,說明比較的時候只看變數中儲存的內容是否相同,而跟記憶體位址無關。
②==比較的兩邊資料需要能強制轉換成同一型,例如int和double的比較,會強制轉換到double。
③布林類型不能和int,float,double,char等基本資料型別做比較,編譯就報錯。
2、對於引用資料型別的比較:
public class Test{ public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); String name1 = "琼宝"; String name2 = "琼宝"; System.out.println(name1 == name2); // true System.out.println(System.identityHashCode(name1)); //366712642 System.out.println(System.identityHashCode(name2)); //366712642 System.out.println(t1 == t2); //false System.out.println(System.identityHashCode(t1)); //366712642 System.out.println(System.identityHashCode(t2)); //1829164700 System.out.println(System.identityHashCode(new Test())); //2018699554 System.out.println(System.identityHashCode(new Test())); //1311053135 System.out.println(new Test() == new Test()); } }
#輸出:
true 366712642 366712642 false 366712642 1829164700 2018699554 1311053135 false
分析:
①對於引用資料型,此時牽涉到兩塊記憶體的問題, 而且比較的也是記憶體位址是否相同,例如執行語句:
Test t1 = new Test() Test t2 = new Test()
時,會開闢兩塊內存,一塊用於儲存t1 t2 ,一塊用於儲存兩個new Test()。而很明顯的是,t1和t2的記憶體位址不一樣,就連兩個new Test()的位址都不一樣,所以此時用==來比較的時候,結果必然是false.
(補充:t1和t2中儲存的其實是new Test() 物件使用的記憶體的首地址。)
②對於String類型來說,內容相同的時候,其記憶體位址也相同,比較的時候看的也是位址。
如果要比較物件中儲存的內容是否相同(不是比較位址),那麼==就無法實現,此時需要equals。
equals的分析
1、先看一個equals比較的例子:
public class TestEquals { public static void main(String[] args) { TestEquals t1 = new TestEquals(); TestEquals t2 = new TestEquals(); System.out.println(t1.equals(t2)); //false String s1 = new String(); String s2 = new String(); System.out.println(System.identityHashCode(s1)); System.out.println(System.identityHashCode(s2)); System.out.println(System.identityHashCode(new String())); System.out.println(System.identityHashCode(new String())); System.out.println(s1.equals(s2)); // true } } 输出结果: false 366712642 1829164700 2018699554 1311053135 true
2、分析:
①t1和t2的比較是false,而s1和s2的比較是true,這裡就牽涉到了equals方法的重寫問題,先看Object類別中equals的源碼:
public boolean equals(Object obj) { return (this == obj); }
② 對於s1.equals(s2) ,this就是s1,obj是s2,而源碼中的比較用的是==,很明顯是引用資料型態的比較,看的是s1和s2的記憶體位址,上面的分析已經知道他們的位址不一樣,所以結果自然就是false.
③而s1和s2的比較結果是true,這是因為在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; }
④通過和object中equals原始碼的比較可以看出,String中的equals方法比較的不再是物件的位址,而是看兩個物件內容,或是兩個物件的屬性是否都一樣。
⑤像String,Date,File…等類別都對equals方法進行了重寫。
總結:
1.==用於比較基本資料型別時,比較的是內容是否相等,比較引用資料型別時,看的是記憶體位址是否相等。
2.equals只能比較引用資料型別(物件),沒被重寫之前,使用==來比較記憶體位址,重寫後比較的是物件的具 體內容和屬性是否一致。
更多相關文章教學請造訪:java程式設計入門
#以上是java中關於==和equals的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!