摘要:例輸出看包裝類源碼會(huì)發(fā)現(xiàn)比較時(shí)會(huì)先去判斷類型是否相同。用包裝類的方式比較時(shí),由于包裝類并不會(huì)自動(dòng)去轉(zhuǎn)換類型,所以類型不同時(shí)即使值相同也會(huì)返回。所以在用包裝類比較數(shù)值時(shí),不要用用方法時(shí)要注意類型相同或者直接用基礎(chǔ)數(shù)據(jù)類型比較。
例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ù)類型比較。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70610.html
摘要:前陣子,我們分享了中的基本數(shù)據(jù)類型轉(zhuǎn)換這篇文章,對(duì)許多粉絲還是有帶來(lái)幫助的,今天講一下包裝類的的由來(lái),及自動(dòng)裝箱拆箱的概念和原理。下面是基本數(shù)據(jù)類型與對(duì)應(yīng)的包裝類型。 showImg(https://segmentfault.com/img/remote/1460000016537706); 前陣子,我們分享了《Java中的基本數(shù)據(jù)類型轉(zhuǎn)換》這篇文章,對(duì)許多粉絲還是有帶來(lái)幫助的,今天講...
摘要:異常處理機(jī)制異常與異常類的繼承體系在程序中,當(dāng)程序出現(xiàn)意外情況時(shí),系統(tǒng)會(huì)自動(dòng)生成一個(gè)來(lái)通知程序,從異常發(fā)生出逐漸向外傳播,如果沒(méi)有人來(lái)處理該異常,就會(huì)交給來(lái)處理,對(duì)異常的處理方法是,打印異常跟蹤棧信息,并中止程序的執(zhí)行。 1 為什么要處理異常? 異常機(jī)制可以使程序的異常處理代碼與正常業(yè)務(wù)代碼分離,保證程序代碼的健壯性。在設(shè)計(jì)程序的時(shí)候,好的程序需要盡可能處理已知的可能產(chǎn)生的錯(cuò)誤,但是事...
摘要:對(duì)象頭的另外一部分是類型指針,即對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例。并不是所有的虛擬機(jī)實(shí)現(xiàn)都必須在對(duì)象數(shù)據(jù)上保留類型指針,換句話說(shuō),查找對(duì)象的元數(shù)據(jù)信息并不一定要經(jīng)過(guò)對(duì)象本身,這點(diǎn)將在節(jié)討論。 目錄介紹 1.關(guān)于int和Integer的問(wèn)題區(qū)別分析 2.Integer的值緩存的原理 2.1 Java 5 中引入緩存特性 2.2 Intege...
摘要:當(dāng)復(fù)制集合中的所有元素來(lái)創(chuàng)建新的集合時(shí),要求集合中的所有元素必須是同一個(gè)枚舉類的枚舉值各實(shí)現(xiàn)類的性能分析的性能總比好,特別是最常用的添加查詢?cè)氐炔僮鳌R驗(yàn)樾枰~外的紅黑樹(shù)算法來(lái)維護(hù)集合元素的次序。在創(chuàng)建時(shí)進(jìn)行,以防對(duì)集合的意外非同步訪問(wèn) HashSet 大多時(shí)候使用Set集合時(shí)就是使用HashSet實(shí)現(xiàn)類。HashSet按Hash算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存取和查找性能 ...
閱讀 2529·2021-07-26 23:38
閱讀 3430·2019-08-30 13:10
閱讀 2316·2019-08-29 18:33
閱讀 2321·2019-08-29 16:12
閱讀 987·2019-08-29 10:59
閱讀 1798·2019-08-26 17:40
閱讀 766·2019-08-26 11:59
閱讀 812·2019-08-26 11:41