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