1. 程式人生 > >Integer兩種不同的賦值方式

Integer兩種不同的賦值方式

前面說了String型別的賦值方式,那麼數字型別呢?下面我就拿Integer解析:

先看下面一段程式碼:

如果看了前面的對String的討論,可能大家會質疑c1 == c2的答案,但真實結果就是如此,為什麼呢?

看看Debug出來的結果,c1、c2與d1、d2組合的Integer後面的id都是不同的,雖然我並不清楚這個id標誌的是什麼,但是id,字面意思就是身份標識,既然身份標識不一樣,肯定不是同一個人了,最多就是同名的人罷了但是身份證(ID)永遠是不同的。

再看看Integer對int的處理方法:

Integer.class -- valueOf(int i)

IntegerCache.class

所以對於c1 == c2 為 false我們也基本有了答案了,與String不同,JDK編譯器在程式執行時就把某個範圍的數字預編譯放進緩衝區(在IntegerCache類中通過靜態變數的方式宣告,並初始化了值),而不是像String那樣在第一次建立物件時建立相應的快取,在第二次採用原型賦值方式時,就首先從緩衝區拿。

所以Integer num = value,當value不在-128~127這個範圍區間時,他就通過new建立不同的物件;當value符合那個區間時,就從開始靜態陣列中(快取區)拿,故不會產生新的物件。這估計也是JDK對於記憶體和效率權衡後確定的範圍。