java Integer与int的装箱(缓存)与拆箱
来源:互联网 发布:杭州知名企业 知乎 编辑:程序博客网 时间:2024/06/11 13:49
装箱与拆箱的含义:
JAVA中的自动装箱指的是把基本类型的值转换为对应的包装类对象,自动拆箱则相反。如下代码所示:
Integer i1=100;
int i2=i1;
分析如下:
(1)Integer i1=100实现了自动装箱,底层调用了调用包装类的valueOf方法,也就是Integer.valueOf(100)。
(2)int i2=i1实现了自动拆箱,底层调用包装类的intValue方法。
需要注意的是:自动装箱拆箱是编译器帮我们自动转换的,我们不需要手工调用valueOf()和intValue()方法。
自动装箱时的缓存问题:
先看一个问题,对于下面定义的四个变量进行==比较:
Integer a=1;Integer b=1;Integer c=200;Integer d=200;System.out.println(a==b);//trueSystem.out.println(c==d);//false
我们都知道==在JAVA里面是比较对象引用的,如果两个对象引用指向堆中的同一块内存就返回true,否则返回false。根据自动装箱规则我们知道Integer a = 1 <==> Integer a = Integer.valueOf(1);,但是在valueOf方法上,查看源码:
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i);}
Integer.valueOf()中有个内部类IntegerCache(类似于一个常量数组,也叫对象池),它维护了一个Integer数组cache,长度为(128+127+1)=256。Integer类中还有一个Static Block(静态块)
static { for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i - 128);}
从这个静态块可以看出,Integer已经默认创建了数值【-128-127】的Integer缓存数据。所以使用Integer a=1时,JVM会直接在该在对象池找到该值的引用。也就是说这种方式声明一个Integer对象时,JVM首先会在Integer对象的缓存池中查找有木有值为1的对象,如果有直接返回该对象的引用;如果没有,则使用New Integer创建一个对象,并返回该对象的引用地址。因为Java中==比较的是两个对象是否是同一个引用(即比较内存地址),a和b都是引用的同一个对象,所以a==b结果为true;c和d已经超出了缓存的范围,所以重新生成了Integer对象,所以c==d结果为false。
转载自:Integer与int的装箱(缓存)与拆箱
- Integer与int的装箱(缓存)与拆箱
- java Integer与int的装箱(缓存)与拆箱
- java Integer与int的装箱(缓存)与拆箱
- Java中Integer与int类型的装箱和拆箱
- Java中Integer与int类型的比较--装箱和拆箱
- Java中Integer与int类型的比较--装箱和拆箱
- Integer.valueOf(int i)与自动拆箱与装箱
- int与Integer,long与Long的区别以及装箱与拆箱的理解
- Integer 和 int 的区别 (自动装箱 与 拆箱)
- 巧记Integer int 自动装箱与拆箱
- Integer的自动装箱与拆箱
- 谈谈JDK1.5新特性之Integer与int的自动装箱和自动拆箱
- 自动装箱与自动拆箱(jdk1.5后)(以int和Integer为例)
- Integer自动拆箱与自动装箱的注意事项
- java中int和Integer的==比较和拆箱装箱
- java int与integer的区别
- Java的Integer与int互转
- java int与integer的区别
- 解决 Fatal error: Call to undefined function imagettftext() 生成验证码错误
- 【bzoj3029】 守卫者的挑战 概率dp
- 按钮图片背景设置方法
- hdu2222 Keywords Search & AC自动机学习小结
- 面题37-58
- java Integer与int的装箱(缓存)与拆箱
- 2015华为校招机试-取石子游戏
- 最大子矩阵和问题归纳总结
- SUSE定时任务的设置
- 工作队列 ( workqueue )
- 重学java23种设计模式(4)原型模式
- java:图形化界面awt基本实例
- 机房收费系统之用VB导出数据到Excel
- 说说第二次配置Ubuntu14.04