目录
在Java中,包装类是对基本数据类型的对象封装,使得基本数据类型能够像对象一样操作。Java 提供了八种基本数据类型的对应包装类,它们都位于java.lang包中。
一、基本数据类型所对应的包装类
除了int-Integer、char-Character,其他的基本数据类型所对应的包装类都是首字母大写。
二、装箱与拆箱
装箱与拆箱是Java中基本数据类型与其对应的包装类之间的转换机制。将基本数据类型转换为对应的包装类对象的过程称为装箱,将包装类对象转换为对应的基本数据类型的过程称为拆箱。
//显示装箱
Integer num1 = Integer.valueOf(200);
//自动装箱
Integer num2 = 100; //编译器自动转换
Integer num = 200; //自动装箱
//显示拆箱
int num3 = num.intValue();
//自动拆箱
int num4 = num; //编译器自动转换
装箱分为显示装箱与自动装箱,同样的拆箱分为显示拆箱与自动拆箱。自动装箱与自动拆箱由编译器自动转换,实践上在底层也调用了相对应的方法。
使用javap -c Test(类名)命令反编译Java类文件并显示其字节码,可见对于自动装箱与拆箱都是由编译器帮我们调用了相对应的方法的。
三、整数缓存机制
public class Test2 {
public static void main(String[] args) {
Integer num1 = Integer.valueOf(100);
Integer num2 = Integer.valueOf(100);
Integer num3 = Integer.valueOf(300);
Integer num4 = Integer.valueOf(300);
System.out.println(num1 == num2); //true
System.out.println(num3 == num4); //false
System.out.println(num3.equals(num4)); //true
}
}
为什么得到这三个结果?
对于valueOf方法,如果参数的数值是在[IntegerCache.low,IntegerCache.high],则返 回 IntegerCache.cache[i + (-IntegerCache.low)]数组中Integer类型的对象,如果不是则返回一个新的对象。
low==-128,high==127,所以数值在-128到127之间时,Integer对象会被缓存,因此相同的数值在这个范围内会共享同一个对象,而超出该范围的数值则是每次创建一个新的Integer对象。
100在缓存范围内,num1和num2实际上引用的是同一个对象,所以num1==num2为true
300不在缓存范围内,num3和num4引用的不是同一个对象,num3==num4为false
equals()方法比较的是对象的内容,num3.equals(num4)为true
public class Test3 {
public static void main(String[] args) {
Integer a = 10; //自动装箱,在[-128,127]使用缓存
Integer b = 10; //在[-128,127]同样使用缓存
System.out.println(a == b); //true
Integer c = 180; // 不在[-128,127]自动装箱,创建新对象
Integer d = 180; // 不在[-128,127]创建另一个新对象
System.out.println(c == d); //false
}
}
完