1.什么是拆装箱
装箱就是将原始类型值转换成对应的对象,拆箱就与之相反。
这里再复习下Java中的数据类型
装箱的基本数据类型和对应的封装类如下:
int——Integer——4Byte
short——Short——2Byte
long——Long——8Byte
float——Float——4byte
double——Double——8Byte
byte——Byte——1Byte
char——Character——2Byte
boolean——Boolean——1bit
2.为什么要拆装箱
装箱的目的主要是想让基本的数据类型也能使用对象的方法
例如再Java集合类中
List<Inteter> list=new ArrayList<Integer>();
Arraylist如果想放入整数只能放对象,就可以将int类型包装成一个类Integer,再放入到集合中。这样整数数组也可以使用ArrayList的各种方法了。
3.如何实现自动拆装箱
这是JavaSE 5.0开始提供的功能。可以自动的实现拆箱和装箱。
//手动装箱
int i=1;
Integer a=new Integer(i);
//自动装箱
Integer b=1;
Integer j=new Integer(8);
//手动拆箱
int m=j.intValue();
//自动拆箱
int n=j;
可以看出能够自动实现拆装箱可以让代码更加简洁
这个实现过程在编译成.class文件的过程就实现了,并不是JVM中实现的。
4.一些例子
public static void main(String[] args) {
//1
Integer a=new Integer(123);
Integer b=new Integer(123);
System.out.println(a==b);//输出 false
//2
Integer c=123;
Integer d=123;
System.out.println(c==d);//输出 true
//3
Integer e=129;
Integer f=129;
System.out.println(e==f);//输出 false
//4
int g=59;
Integer h=new Integer(59);
System.out.println(g==h);//输出 true
}
代码1好理解,因为新建了不同的对象。
代码2为什么返回true呢?原来自动装箱的源码简化如下:
public static Integer valueOf(int i) {
if (i >= -128 && i <= 127)
return IntegerCache.cache[i + 127];
//如果i的值大于-128小于127则返回一个缓冲区中的一个Integer对象
return new Integer(i);
//否则返回 new 一个Integer 对象
}
这一点与Python类似,原来IntegerCache 类在初始化的时候,生成了一个大小为 256 的integer 类型的常量池,并且integer.val 的值从-128-127,当我们运行 Integer c=a ;时,如果 -128<=a<=127时,不会再生成新的integer对象,直接从常量池中找到对应的已经初始化后的对象。当 a<-128||a>127时才会生成一个新的对象。所以代码3返回的也是false
值得注意的是代码4中,最后在比较g h 的值时,用了自动拆箱,g == h 这一代码执行的是:g==h.IntValue(),而h.IntValue()= 59 。所以实际上比较的是两个int类型,返回为true。