==的分析
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。