解決Java包裝類比較時遇到的問題
前言
本文主要給大家介紹了關于Java包裝類在比較時遇到的一些問題的解決方法,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
例1:
Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e= 321; Integer f= 321; Long g = 3L; System.out.println(c == d); //1 System.out.println(e == f); //2 System.out.println(c == (a+b)); //3 System.out.println(c.equals(a+b));//4 System.out.println(g == (a+b)); //5 System.out.println(g.equals(a+b)); //6
輸出結果
true false true true true false
1.包裝類比較,不會自動拆包,但是Integer中會有一個cache 存儲-128到127的數,所以c與d的地址值相同。
2.地址值比較,沒用到cache
3.當 '=='時,右側發(fā)生自動拆包,所以其實是int值在比較
4.a+b 時拆包成int,傳入Integer的equals方法進行自動裝包。equals方法內是值比較。
5.會拆包成基礎數據類型比較
6.包裝類的equals 會判斷類型,Long.equals(Object object)
中判斷類型不符合,返回false。
例2:
Long a = 1L; Integer b = 1; System.out.println(a.equals(1)); //7 System.out.println(a.equals(1L)); System.out.println(a.equals(b));
輸出
false true false
看包裝類源碼會發(fā)現比較時會先去判斷類型是否相同。
7.a.equals(1)
時,int 1 裝包成Integer,自然和Long不同類型。
public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }
總結:
當使用自動拆包/裝包時,包裝類之間比較并不會自動拆包,是地址比較,其中還有緩存會影響結果。
用包裝類的equals方式比較時,由于包裝類并不會自動去轉換類型,所以類型不同時,即使值相同,也會返回false。所以在用包裝類比較數值時,不要用'==',用equals方法時要注意類型相同,或者直接用基礎數據類型比較。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
mybatis中點擊mapper接口快速定位到對應xml中sql方式
這篇文章主要介紹了mybatis中點擊mapper接口快速定位到對應xml中sql方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01multi-catch和try-catch異常處理知識點詳解
在本篇文章里我們給大家分享了一篇關于multi-catch和try-catch異常處理知識點內容,有需要的朋友們可以參考學習下。2019-11-11