1. 程式人生 > >Integer包裝類源碼分析

Integer包裝類源碼分析

java

看到幾道關於Integer拆裝箱的小題目,正好有點時間翻看了一下Integer類的源碼,加上自己的一點思考,決定寫點東西。

先來看看下面的代碼:

技術分享

如果這道題你能得出正確答案並了解其中的原理,說明你的基礎還可以。如果你的答案是true和true的話,建議你去看看書。

程序運行結果:

技術分享

我們知道==比較的是兩個對象的引用,這裏a、b、c、d都是新建出來的對象,按道理都應該輸出false才對, 想知道其中的原理,我們去看看Integer.java這個類的源碼就知道了。

技術分享

技術分享

當我們聲明Integer c = 10;的時候,此時編譯器會進行自動裝箱操作,簡單的說,也就是把基本數據類型轉換成Integer對象,而把int型轉換成Integer對象正是調用的valueOf(int i)方法。從上面的源碼中可以看出,Integer中把-128--127這256個數據緩存了下來。官方的說法是這些小的數字使用的頻率比較高,為了優化性能,就把這之間的數緩存了下來。這就是為什麽輸出結果是false和true了。當聲明的Inetger對象的值在-128--127之間時,引用的是緩存中的同一個對象(已經創建好保存在緩存中),所以結果是true;當聲明的Integer對象的值不在這個範圍之類的時候,就會通過new Integer(i);語句創建一個Integer對象。

我們再來看下面這段代碼:

技術分享

如果這道題你能很快給出正確答案,那麽==比較符你就掌握的比較透徹了。公布答案:

技術分享

看到這個答案,小夥伴們可能又會不解,上面不是說Integer把-128--127緩存起來了嗎,這個不應該是true嗎?但是你仔細看,這裏的Integer對象是我們自己new出來的,並不是用緩存,所以結果是false。那第一個為啥又是true呢?首先這裏b的值為1000,肯定跟我們所知的Integer緩存沒關系,既然和緩存沒有關系,a是我們new出來的對象,那應該輸出false才對呀?註意這裏b是int型,當int和Integer進行==比較的時候,Java編譯器會把Integer進行自動拆箱,也就是把Integer轉為int型,所以這裏進行比較的是int型的值,因此結果為true。


Integer包裝類源碼分析