您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關java中==和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、對于基本數據類型,比較的是他們的具體內容是不是一樣,跟他們的內存地址無關。
舉個例子:
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
==分析:
①根據比較的結果和內存地址來看,內容一樣,內存地址不一樣,但是返回的結果都是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。
總結:
1.==用于比較基本數據類型時,比較的是內容是否相等,比較引用數據類型時,看的是內存地址是否相等。
2.equals只能比較引用數據類型(對象),沒被重寫之前,使用==來比較內存地址,重寫后比較的是對象的具 體內容和屬性是否一致。
上述就是小編為大家分享的java中==和equals的使用方法了,如果您也有類似的疑惑,不妨參照上述方法進行嘗試。如果想了解更多相關內容,請關注億速云行業資訊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。