基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
1.对两个包装类对象进行==比较时,比较的是对象的内存地址,而不是包装类所封装的基本类型数据的值,于是
Integer i1 = new Integer(20);
Integer i2 = new Integer(20);
system.out.println(i1==i2);//false
2.包装类缓存
先看下面一段程序:
public class test {
public static void main(String[] args) {
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);//true
System.out.println(i3==i4);//false
System.out.println("-------------------");
Long l1 = 10L;
Long l2 = 10L;
Long l3 = 200L;
Long l4 = 200L;
System.out.println(l1==l2);//true
System.out.println(l3==l4);//false
System.out.println("-------------------");
Float f1 = 10f;
Float f2 = 10f;
Float f3 = 200f;
Float f4 = 200f;
System.out.println(f1==f2);//false
System.out.println(f3==f4);//false
System.out.println("-------------------");
Double d1 = 10d;
Double d2 = 10d;
Double d3 = 200d;
Double d4 = 200d;
System.out.println(d1==d2);//false
System.out.println(d3==d4);//false
System.out.println("-------------------");
}
}
不同的值对于同一个包装类来说,使用==运算得出不同的结果,这要从包装类是不可变的说起。就像String类的对象,一被创建变不可改变,所以,多个引用指向同一个String对象也不会有危险,因此编译阶段将String放入字符常量池中,但下次使用时直接从中提取,而对于包装类来说其对象同样是不可改变的,对于某些频繁使用的值,系统提供了包装类的缓存(预先创建了使用的包装类对象,可以参考包装类的valueOf方法),但需要时直接从缓冲中提取,而不要再创建一个新的包装类对象,这些缓存的包装类的值如下:
boolean的所有值(true false)
byte的所有值(-128-127)
char值的0-127
short值的-128-127
int值的-128-127
long值的-128-127
对以上数据进行封箱的时候并不是创建一个新的对象,而是使用缓存的对象,这样就可以避免重复使用的时候创建对象造成的浪费。但是注意,对于浮点型float和double,包装类没有缓存。
3.封箱还是拆箱?
在Java中==和!=可以作用于任何类型,但如果这两个二元运算符的两个操作数一个是基本数据类型,另一个是包装类,则将包装类拆箱成基本数据类型然后对两个值进行比较。 |
|