解決Java包裝類比較時(shí)遇到的問(wèn)題
前言
本文主要給大家介紹了關(guān)于Java包裝類在比較時(shí)遇到的一些問(wèn)題的解決方法,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
例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
輸出結(jié)果
true false true true true false
1.包裝類比較,不會(huì)自動(dòng)拆包,但是Integer中會(huì)有一個(gè)cache 存儲(chǔ)-128到127的數(shù),所以c與d的地址值相同。
2.地址值比較,沒(méi)用到cache
3.當(dāng) '=='時(shí),右側(cè)發(fā)生自動(dòng)拆包,所以其實(shí)是int值在比較
4.a+b 時(shí)拆包成int,傳入Integer的equals方法進(jìn)行自動(dòng)裝包。equals方法內(nèi)是值比較。
5.會(huì)拆包成基礎(chǔ)數(shù)據(jù)類型比較
6.包裝類的equals 會(huì)判斷類型,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
看包裝類源碼會(huì)發(fā)現(xiàn)比較時(shí)會(huì)先去判斷類型是否相同。
7.a.equals(1)時(shí),int 1 裝包成Integer,自然和Long不同類型。
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
總結(jié):
當(dāng)使用自動(dòng)拆包/裝包時(shí),包裝類之間比較并不會(huì)自動(dòng)拆包,是地址比較,其中還有緩存會(huì)影響結(jié)果。
用包裝類的equals方式比較時(shí),由于包裝類并不會(huì)自動(dòng)去轉(zhuǎn)換類型,所以類型不同時(shí),即使值相同,也會(huì)返回false。所以在用包裝類比較數(shù)值時(shí),不要用'==',用equals方法時(shí)要注意類型相同,或者直接用基礎(chǔ)數(shù)據(jù)類型比較。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
springboot?sleuth?日志跟蹤問(wèn)題記錄
Spring?Cloud?Sleuth是一個(gè)在應(yīng)用中實(shí)現(xiàn)日志跟蹤的強(qiáng)有力的工具,使用Sleuth庫(kù)可以應(yīng)用于計(jì)劃任務(wù)?、多線程服務(wù)或復(fù)雜的Web請(qǐng)求,尤其是在一個(gè)由多個(gè)服務(wù)組成的系統(tǒng)中,這篇文章主要介紹了springboot?sleuth?日志跟蹤,需要的朋友可以參考下2023-07-07
mybatis中點(diǎn)擊mapper接口快速定位到對(duì)應(yīng)xml中sql方式
這篇文章主要介紹了mybatis中點(diǎn)擊mapper接口快速定位到對(duì)應(yīng)xml中sql方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
multi-catch和try-catch異常處理知識(shí)點(diǎn)詳解
在本篇文章里我們給大家分享了一篇關(guān)于multi-catch和try-catch異常處理知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2019-11-11
idea復(fù)制module(項(xiàng)目)并在一個(gè)窗口展示的教程詳解
這篇文章主要介紹了idea復(fù)制module(項(xiàng)目)并在一個(gè)窗口展示的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Idea 2023.2.5配置插件、Maven的過(guò)程
這篇文章主要介紹了Idea 2023.2.5配置插件、Maven的過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11

