包装类:将基本数据类型转化成对象
在构造函数的章节当中我们讲过,double的默认值是0.0,这是因为基本数据类型不是类类型,它们也没有对应的实例。
所以我们定义int或者long的时候都是直接赋值的,比如: long a = 3;
但正因为它们不是类,所以它们也没有对应的方法和变量,也就没有各种各样的功能。
更主要的一点,在一些场景当中,我们是不能使用基本数据类型只能使用对象的。比如一些容器,像是ArrayList、HashMap只能接受一个对象,再比如我们提供了一个方法,但是调用方有可能传入一个空值。如果我们使用基本数据类型,null会引发报错。
所以包装类正是为了解决这个问题而产生的。
包装类和一般的类有些不太一样,稍微有些特殊,最特殊的地方就在于他们初始化的时候,既可以使用类的形式通过new来创建实例,也可以像是它们的基本数据类型那样,直接赋值:
这两种方法都是可以的,不过IDE推荐使用第一种。
Integer a = 3;
Integer b = new Integer(3);
//自动装箱
Integer i=100; // 相当于Integer i= Integer.valueOf(100);基本数据类型转为对象
//自动拆箱
int b=i; // 编译器会修改成int b=i.intValue(); 对象转为基本数据类型
包装类的缓存
缓存[【-128,127]之间的数字,实际就是系统初始时,创建了[-128,127]之间的一个缓存数组。
当调用valueOf()的时候,首先检查是否在[-128,127]之间,如果在这个范围则直接从缓存数组中拿出已经建好的对象。
如果不在这个范围,则创建新的Integer对象。
Integer in1 = -128;
Integer in2 = -128;
System.out.println(in1 == in2);//true 因为123在缓存范围内
System.out.println(in1.equals(in2));//true 因为值一样
Integer in3 = 1234;
Integer in4 = 1234;
System.out.println(in3 == in4);//false 因为1234不在缓存范围内
System.out.println(in3.equals(in4));//true 值一样