您的位置:首页 > 编程语言 > Java开发

JDK5.0自动装箱拆箱注意IntegerCache的范围

2013-10-18 19:59 246 查看
在JDK5.0中,为了简化书写,出现了自动装箱和拆箱机制。

原来的写法:

Integer i = new Integer(5);


新的写法:

Integer i = 5;//自动装箱,内部运行时,通过Integer.valueOf(5);方法将5封装成Integer对象。


i + 3; i是一个对象,无法直接和5进行加法运算,必须先转成基本数据类型,通过调用i对象的intValue()方法。

有趣的现象:

Integer i1 = 5;
Integer i2 = 5;

System.out.println(i1==i2);//true 为什么呢?

//当给i1,i2重新赋值,
Integer i1 = 500;
Integer i2 = 500;
System.out.println(i1==i2);//false?


这时最好去查看装箱的原理Integer.valueOf()方法是怎么实现。
valueOf源码

public static Integer valueOf(int i){
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}


IntegerCache是Integer中的一个内部类。
IntegerCache.high的值就是127.

通过源码不难看出,IntegerCache将-128~127之间的数值对象进行了缓存
如果装箱的数值在该范围内,它并不创建一个新对象,而是返回一个缓存中已有对象。
所以值为5时,正好在该范围内,i1和i2引用的是同一个对象。
值为500时,在该范围以外,i1和i2引用的是不同对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: