Java 關於Integer包裝類的乙個坑

2021-08-02 12:16:11 字數 1769 閱讀 6502

這也算是一道面試題,很多初學者在看到以下**的時候第一反應就是輸出兩個true,其實不然。

public

class

integertest

}

博主當初的反應也是一樣,認為兩個結果都為true,但實際的執行結果如下:

true

false

很多沒看過原始碼的小夥伴會和博主一樣一頭霧水(跟想象的完全不一樣嘛)。

其實不用懷疑人生,我們看下integer的原始碼就知道為什麼會出現上述結果(我這裡是jdk1.8的原始碼),這裡僅摘取關鍵部分原始碼。

private

static

class

integercache

catch

( numberformatexception nfe)

} high = h;

cache =

newinteger

[(high - low)+1

];int j = low;

for(

int k =

0; k < cache.length; k++

) cache[k]

=new

integer

(j++);

// range [-128, 127] must be interned (jls7 5.1.7)

assert integercache.high >=

127;

}private

integercache()

}

從這段**中我們可以看到,integer物件在其內部是有快取機制的,它快取區間的值在-128~127之間,存放在自定義的cache陣列當中。

而對於我們的integer a = 100來說,它實際在內部做了integer a = integer.valueof(100)類似的操作,所以我們再來看下valueof這個方法的具體操作,**如下:

public

static integer valueof

(int i)

integercache靜態內部類中,我們發現integercache.low的值為-128integercache.high的值為127

valueof(int i)這個方法很明顯的意思就是說:

換句話說,對於integer var = ?這種在-128~127區間的賦值,integer物件是在integer.integercache.cache中產生,所以可以復用已經存在的物件,也就是說在這個區間內的integer值可以直接使用==來進行判斷。而在這個區間之外的數該如何判斷?在這個區間之外的數都會在堆上產生乙個新的物件,從而不會復用已經存在的物件,所以這個時候==就不能夠對其進行判斷,而應該使用equals方法來判斷。

因此,上面題目中的c == d結果為什麼是false也就說得通了。

java基礎之Integer包裝類

integer類概述 integer 類在物件中包裝了乙個基本型別 int 的值 該類提供了多個方法,能在 int 型別和 string 型別之間互相轉換,還提供了處理 int 型別時非常有用的其他一些常量和方法 構造方法 public integer int value public intege...

Java中的包裝類(Integer類)

包裝類 integer類在物件中包裝了乙個基本型別 int 的值。integer 型別的物件包含乙個 int 型別的字段。父類 number 父介面 serializable,序列化介面 comparable 自然比較介面 構造器 構造方法摘要 integer int value 構造乙個新分配的 ...

java包裝類之Integer類原始碼分析

integer類是實體類中必不可少的乙個包裝型別,其它類中可能也會用到,下面我來講講integer類的原始碼分析 author nice 繼承了number類實現了comparable介面 public final class integer extends number implements co...