概述
基本变量类型的autoboxing和unboxing是J2SE 5.0的新特性。在Java编程开发中要处理的基本都是对象(Object),例如字符串(String)、数组(Array)等。
使用
在之前,要使用打包类型(Wrapper Types)才能将对象赋值到变量,例如:
Integer integer = new Integer(10);
在J2SE 5.0之后,可以这样写
Integer integer = 10
事实上是编译器在编译时自动根据代码描述进行自动装箱动作,自动装箱同样适用于其他基本变量类型。
实际上自动装箱还可以像以下使用:
int i = 10;
Integer integer = i;
甚至还可以用Number这样用:
Number number = 3.14f;
3.14f 会先被装箱为Float类型,然后在指定给number。
JSE 5.0 之后可以 自动拆箱,像下面这样:
int i = 10;
int j = i + 10;
Boolean b = true;
Boolean c = b && false;
则 j 为 20 , c 为 false。
注意
虽然autoboxing和unboxing很方便,但是要小心使用这种语法糖。
第一个坑
Integer i = null;
int j = i;
上面这个语法在编译时是合法的,在运行时却会出现NullPointerException的错误。因为 null 赋值给 i 时表示变量为空,表示变量没有任何参考实例。但是当一个变量为空时赋值给另一个变量这种指定是不合法的。
第二个坑
Integer i1 = 200;
Integer i2 = 200;
Boolean b = i1 == i2;
正常来讲 i1 是等于 i2 的吧。但是事实却恰恰相反,因为==不仅比较值是否相等,还要比较地址是否相等,意思就是看你是不是同一个实例对象。如果赋给变量的值在 -128 到 127 之间,装箱后会在内存中被复用,但是 200 明显大于Integer的范围,于是就会每次都新建一个Integer对象。比较值相等时最好使用equals。