1、装箱与拆箱是什么
装箱是将值类型换成引用类型的过程,
拆箱是将引用类型转换成值类型的过程
装箱:用于在垃圾回收堆中存储值类型,装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换。
拆箱,从object类型到值类型或者从接口类型到实现该接口的值类型的显式转换。
2、定义
Integer i = new Integer(1);
从JDK1.5开始就提供了自动装箱的功能,要生成一个数值为1的Integer对象,只需:
Integer i = 1;(这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。)
举例:
Integer i = 1; //装箱(定义的时候自动进行装箱)
int j = i; //拆箱(进行赋值或者逻辑运算时会自动进行拆箱)(将引用类型Integer的i转换成值类型int的i,然后进行赋值或者四则运算)
3、作用是什么?为什么要进行拆箱和装箱?
4、如何进行装箱和拆箱?
如下通过反编译: int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的intValue方法
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
System.out.println(i1 == i2);
// false new过了,在堆里新建了个地址快
Integer i3 = 126;
Integer i4 = 126;
int i5 = 126;
System.out.println(i3 == i4);
System.out.println(i3 == i5);
//true 都没有超标用的是缓存数据
//true 自动拆箱比较内容
Integer i6 = 128;
Integer i7 = 128;
int i8 = 128;
System.out.println(i6 == i7);
System.out.println(i6 == i8);
//false 超标 new过了
//自动拆箱,比较数值
分情况来比较
-
都定义為Integer的比較
new :一旦new,就是开辟一块新内存,结果肯定是false
不new :
看范围:
Integer做了缓存,-128至127.当你取值在这个范围的时候,会采用缓存的对像
所以会相等,当不在这个范围,内部创建新的对象, 此时不相等
Integer和int的比较:
实际比较的是数值,Integer会做拆箱的动作,来跟基本数据类型做比较,此时跟是否,在缓存范围内或是否new都没有关系
源码分析:
当我们写Integer i=126.实际上做了自动装箱,Integer i=Integer.valueOf(126);分析这段源码