Java 装箱和拆箱 128陷阱问题
装箱与拆箱
概念
装箱:在程序设计中,值类型实例到对象的转换,它暗示在运行时实例将携带完整的类型信息,并在堆中分配。
拆箱:拆箱是将引用类型转换为值类型,利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。
(概念有点晦涩,但是用起来就很简单了。)
小例子
Integer number=100;//100是int类型,number是Integer对象,此为自动装箱。
int i=number;//i为int类型,number为Integer对象,此为自动拆箱;
看了上面的例子是不是已经对装箱、拆箱心理有底了?
Java中需要装箱拆箱的类型
基本类型 | 包装器类型
byte | Byte
short | Short
int | Integer
long | Long
float | Float
double | Double
bool | Boolean
char | Character
128陷阱
很简单的一个小例子
Integer n1=100;
Integer n2=100;
Integer n3=200;
Integer n4=200;
System.out.print(n1==n2);
System.out.print(n3==n4);
在上面的例子中最终打印出以下:
true
false
为什么?
因为Integer包装器在自动装箱过程中将数据小于128和大于127时会创建另一个Integer对象,并将其值复制进去,所以n3=n4这个判断其实是两个对象引用的判断,故而返回false
但是!在Double包装器自动装箱时每次都会创建一个Double对象。
我们可以将他们分成Integer类和Double类:
Integer类:Byte、Short、Integer、Long、Character;
Double类:Float、Double;
因为Boolean只有两种情况,所以它是一个十分特立独行的仔。
额外小记:拆箱时的空指针错误
Integer i1=null;
int=i1;
这段代码可以通过编译但是运行时会有空指针错误,因为包装器类在自动拆箱时会调用inValue();方法,当参数为null,当然会报错啦!
以上
现在熬夜是为了以后不熬夜 Fighting!