JDK5.0自动装箱拆箱注意IntegerCache的范围
2013-10-18 19:59
246 查看
在JDK5.0中,为了简化书写,出现了自动装箱和拆箱机制。
原来的写法:
新的写法:
i + 3; i是一个对象,无法直接和5进行加法运算,必须先转成基本数据类型,通过调用i对象的intValue()方法。
有趣的现象:
这时最好去查看装箱的原理Integer.valueOf()方法是怎么实现。
valueOf源码:
IntegerCache是Integer中的一个内部类。
IntegerCache.high的值就是127.
通过源码不难看出,IntegerCache将-128~127之间的数值对象进行了缓存。
如果装箱的数值在该范围内,它并不创建一个新对象,而是返回一个缓存中已有对象。
所以值为5时,正好在该范围内,i1和i2引用的是同一个对象。
值为500时,在该范围以外,i1和i2引用的是不同对象。
原来的写法:
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引用的是不同对象。
相关文章推荐
- Integer自动拆箱与自动装箱的注意事项
- Integer的自动装箱与自动拆箱注意事项
- 初学者对自动装箱和自动拆箱的认识(IntegerCache的缓存数组)
- Integer自动装箱和拆箱和比较
- 你会使用jdk5.0提供的自动装箱拆箱功能吗?
- 1.4--1.5.4 泛型类A<Integer>与接口Interface A<Integer>、自动装箱/拆箱Integer->int、菱形运算符<>、数组协变、通配符?
- Java 包装类 自动装箱和拆箱--Integer
- java 自动装箱和拆箱应注意的问题
- int Integer 装箱 拆箱 自动装箱 自动拆箱
- Java自动装箱拆箱注意点
- 黑马成员---StringBuffer,StringBuilder,Integer,自动装箱和拆箱,正则表达式:匹配,切割,替换,查找
- 由自动装箱和拆箱引发我看Integer源码
- Java 自动装箱和自动拆箱注意的问题
- 你会使用jdk5.0提供的自动装箱拆箱功能吗?【转】
- JavaSE8基础 Integer与int自动转换 自动装箱与拆箱
- integer自动装箱拆箱&String内存分配测试
- 关于自动装箱 与自动 和自动拆箱。Integer,Boolean等
- 巧记Integer int 自动装箱与拆箱
- Integer自动拆箱、自动装箱
- 关于Integer自动装箱和拆箱的小知识