摘要:昨晚與一同事聊天,他正在找工作,讓我問(wèn)他點(diǎn)常見(jiàn)面試題,然后發(fā)現(xiàn)他對(duì)的實(shí)現(xiàn)原理不是太清楚,他錯(cuò)誤地以為只要不超過(guò)范圍的兩個(gè)對(duì)象就能用進(jìn)行比較,但其實(shí)并不是這樣的這里先上一個(gè)例子運(yùn)行結(jié)果如下下面說(shuō)一下,原理實(shí)現(xiàn)內(nèi)部有一個(gè)靜態(tài)變量池存放了一個(gè)
昨晚與一同事聊天,他正在找工作,讓我問(wèn)他點(diǎn)常見(jiàn)面試題,然后發(fā)現(xiàn)他對(duì)Integer, Long, BigDecimal的實(shí)現(xiàn)原理不是太清楚,他錯(cuò)誤地以為只要不超過(guò)范圍(-128 ~ 127)的兩個(gè)對(duì)象就能用==進(jìn)行比較,但其實(shí)并不是這樣的;
這里先上一個(gè)例子:
public static void main(String[] args) {
int test = 3; Integer intA = new Integer(3); Integer intB = new Integer(3); Integer intC = 2 + 1; Integer intD = 52 -49; Integer intE = 3; Integer intF = test; System.out.println(intA == intB); System.out.println(intA == intC); System.out.println(intC == intB); System.out.println(intC == intD); System.out.println(intC == intE); System.out.println(intD == intE); System.out.println(intD == intF);
}
運(yùn)行結(jié)果如下:
false
false
false
true
true
true
true
下面說(shuō)一下,原理實(shí)現(xiàn)
Integer 內(nèi)部有一個(gè)靜態(tài)變量池 IntegerCache, 存放了一個(gè)數(shù)組Integer[], -128 ~ 127;
普通的兩個(gè)值運(yùn)算都會(huì)進(jìn)行自動(dòng)拆箱,再進(jìn)行自動(dòng)裝箱,自動(dòng)裝箱使用的是valueOf方法,Integer.valueOf方法在實(shí)現(xiàn)時(shí)如果不超過(guò)范圍(-128 ~ 127)則從 IntegerCache 中獲取緩存的Integer對(duì)象; 如果超過(guò)范圍則是new 一個(gè)新Integer對(duì)象
從IntegerCache池子中取到的對(duì)象同一個(gè)因此可以用 == 進(jìn)行比較, 例如:
Integer intD = 52 -49;
Integer intE = 3;
這兩個(gè)都是從IntegerCachek中取的同一個(gè)對(duì)象,因此可以進(jìn)行 == 比較;
而使用構(gòu)造函數(shù)的,則不會(huì)從IntegerCache中取, 例如
Integer intA = new Integer(3);
Integer intB = new Integer(3);
他是兩個(gè)新的Integer對(duì)象,盡管value也是在-128~127之間,但并不是從靜態(tài)變量池 IntegerCache中取的,因此,此時(shí)如果用 == 判斷則為false;
總結(jié):
兩個(gè)條件都滿足的情況下才可以用 == 判斷兩個(gè)Integer對(duì)象是否相等
1.值在-128~127之間
2.比較的兩個(gè)對(duì)象都是使用valueOf創(chuàng)建出來(lái)的,或者通過(guò)數(shù)學(xué)計(jì)算后自動(dòng)裝箱(valueOf)得來(lái)的
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74820.html
摘要:對(duì)象的自動(dòng)清除對(duì)象回收是由垃圾回收線程負(fù)責(zé)方法可以要求系統(tǒng)進(jìn)行垃圾回收,僅僅是建議系統(tǒng)沒(méi)有析構(gòu)方法,但的有類似方法系統(tǒng)在回收時(shí)會(huì)自動(dòng)調(diào)用對(duì)象的方法子類的方法可以在里面釋放系統(tǒng)資源,一般來(lái)說(shuō),子類的方法中應(yīng)該調(diào)用父類的方法。 對(duì)象的自動(dòng)清除 對(duì)象回收是由垃圾回收線程負(fù)責(zé) System.gc()方法可以要求系統(tǒng)進(jìn)行垃圾回收,僅僅是建議系統(tǒng) java沒(méi)有析構(gòu)方法,但Object的final...
摘要:如果我們想要多次輸出類中的成員信息,就需要多次書寫方法每用一次就得寫而調(diào)用就簡(jiǎn)單多了補(bǔ)充兩者等價(jià)輸出結(jié)果。注一般選擇重寫方法,比較對(duì)象的成員變量值是否相同,不過(guò)一般重寫都是自動(dòng)生成。 第三階段 JAVA常見(jiàn)對(duì)象的學(xué)習(xí) 第一章 常見(jiàn)對(duì)象——Object類 引言: 在講解Object類之前,我們不得不簡(jiǎn)單的提一下什么是API,先貼一組百度百科的解釋: API(Application Pro...
摘要:本章部分內(nèi)容從源碼中解讀一些自動(dòng)裝箱與拆箱的原理,以及會(huì)出現(xiàn)的一些陷阱已經(jīng)性能等。例題分析我們通過(guò)幾個(gè)經(jīng)典的問(wèn)題,來(lái)看看大家到底理解了裝箱與拆箱的知識(shí)點(diǎn)沒(méi)。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190426221918208.pn...
摘要:更好的辦法把所有的都到緩沖池去吧最好在用到的時(shí)候就進(jìn)行這個(gè)操作然后就可以用比較兩個(gè)字符串的值了二簡(jiǎn)單數(shù)據(jù)類型和封裝類中的和為每一個(gè)簡(jiǎn)單數(shù)據(jù)類型提供了一個(gè)封裝類,每個(gè)基本數(shù)據(jù)類型可以封裝成對(duì)象類型。 值類型是存儲(chǔ)在內(nèi)存中的堆棧(以后簡(jiǎn)稱棧),而引用類型的變量在棧中僅僅是存儲(chǔ)引用類型變量的地址,而其本身則存儲(chǔ)在堆中。 ==操作比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
摘要:相等判斷符介紹相等判斷符用于比較基本數(shù)據(jù)類型和引用類型數(shù)據(jù)當(dāng)比較基本數(shù)據(jù)類型的時(shí)候比較的是數(shù)值當(dāng)比較引用類型數(shù)據(jù)時(shí)比較的是引用指針判斷基本類型是否相等首先基本數(shù)據(jù)類型指的是中的八大數(shù)據(jù)類型這八大基本數(shù)據(jù)類型有個(gè)共同的特點(diǎn)是它們?cè)趦?nèi)存中是有具相等判斷符==介紹 ? ==相等判斷符用于比較基本數(shù)據(jù)類型和引用類型數(shù)據(jù). 當(dāng)比較基本數(shù)據(jù)類型的時(shí)候比較的是數(shù)值, 當(dāng)比較引用類型數(shù)據(jù)時(shí)比較的是引用(指...
閱讀 649·2021-11-11 16:55
閱讀 2160·2021-11-11 16:55
閱讀 1951·2021-11-11 16:55
閱讀 2341·2021-10-25 09:46
閱讀 1598·2021-09-22 15:20
閱讀 2269·2021-09-10 10:51
閱讀 1703·2021-08-25 09:38
閱讀 2612·2019-08-30 12:48