Java Integer對象你們應該都不陌生吧,今天咱們就一塊兒來探討一下。
).|`\=r
Integer i1 = 10;
(JsBFz E
Integer i2 = 10;
kHxfL#,
System.out.println(i1 == i2);
Y<]H1++
Gm9y|/rK
Integer a1 = 128;
H1 .luHT
Integer a2 = 128;
$gA7_kf`f
System.out.println(a1 == a2);
AUNwp?v
打印結果是true和false,至於爲何看了Integer源代碼後就能明白,Integer有個內部類IntegerCache,它維護了一個Integer數組cache[] ,長度爲256,還有一個靜態塊
BYY;4j${
static {
Jo?n!1
for(int i = 0; i < cache.length; i++)
' 9vbU2Buu
cache
= new Integer(i - 128); plAxw 1
} |^Tfc!bx'
很明顯這個靜態塊已經默認認建立出了-128~127 的 Integer 數據,這也是JAVA出於性能考慮。 |zKTz
至於上面的代碼通過編譯後就變成了 _qSw}9L
Integer i1 = Integer.valueOf(10); *$@$7_
Integer i2 = Integer.valueOf(10) }=>wx+X
System.out.println(i1 == i2); %1UxjFn
'AH];JN
Integer a1 = Integer.valueOf(128) {!TW?+)
Integer a2 = Integer.valueOf(128) :)fU 3/v
System.out.println(a1 == a2); p{ :d y.Z
iXw*rWmH
看看Integer的valueOf方法,如果在-128到127之間的數,它會直接數據引用,由於它已經建立了數據對象,但若超出這個範圍,它就new了一個Integer對象。因此值爲128時,每次都是不一樣的對象。 Fib:!z Ct
public static Integer valueOf(int i) { Px\n&
final int offset = 128; 3p5|>R$w
if (i >= -128 && i <= 127) { // must cache (WjE*; ~O
return IntegerCache.cache[i + offset]; CD?%_ '}
} NLD,P {p
return new Integer(i); _m,IDoB2
} Yo tP
順帶一提,我用的JDK 1.5,若在1.4環境下Integer i1 = 10; 這種寫法會報錯, .7j% P|
必須改成Integer i1 = new Integer(10); 這是由於1.5的自動裝箱特性。 h A%}2fkc