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