为什么要包装类?
在某些场景下,无法直接使用基本数据类型,所以还是需要使用对象,Java 的包装类就是这样出现的。例如泛型不支持基本类型,只能使用包装类来代替基本类型。又因为出于性能考虑保留了8个基本类型。
八个包装类
基本类型 包装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double
自动装箱和自动拆箱
我们知道一段代码的执行过程中,最开始是一个叫javac的编译器将.java文件编译称为.class的文件,在这个过程当中下段代码会执行如下操作
Integer b = 10; //会被编译成 Integer b = Integer.valueOf(10); //自动装箱 int a = b; //会被编译成 int a = b.intValue(); //自动拆箱
自动装箱就是当把基本类型数据赋给相应的包装类时,把基本类型数据自动转成包装类的过程。
自动拆箱就是把包装类数据赋给基本类型时,把包装类数据自动转成基本类型的过程
128陷阱
public static void main(String[] args) { Integer num1 = 100; Integer num2 = 100; System.out.println(num1 == num2); Integer num3 = 128; Integer num4 = 128; System.out.println(num3 == num4); } /* true false */
答案就在Integet的valueOf()方当中,如果我们的数值在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。
自动拆装箱和128陷阱小例题
public static void main(String[] args) { int a = 10; int b = 10; Integer a1 = 10; Integer b1 = 10; Integer a2 = new Integer(10); Integer b2 = new Integer(10); System.out.println(a == b); // T 基本数据类型 == 比较值 System.out.println(a1 == b1); // T 128陷阱 System.out.println(a2 == b2); // F 引用数据类型 == 比较地址 System.out.println(a1 == a); // T用 == 判断,自动拆箱 System.out.println(a1.equals(a)); //T用equals()判断,自动装箱 System.out.println(a1 == a2);//F System.out.println(a == a2);// T a2自动拆箱 }