Java自动拆装箱

1,470 阅读2分钟

概述

基本变量类型的autoboxingunboxing是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。

注意

虽然autoboxingunboxing很方便,但是要小心使用这种语法糖。
第一个坑

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