自动装箱
在java中有八种基本数据类型
- boolean
- byte
- cha、
- short
- int
- float
- double
- long
每一种类都对应一个包装类
我们以 int 为例
int 的 包装类为Integer
装箱:将一个值包装为一个包装类
自动装箱 就是程序自动将一个值包装为一个包装类
Integer a = 1;
//Integer是一个 类 1 是一个int型数据
// Integer a = 1; == Integer a = Integer.valueOf(1);
// 其实该程序执行的是 Integer a = Integer.valueOf();将一个int型数据自动包装成一个Integer类型的对象 这就是 自动装箱
Integer b = 1;
Integer c = 321;
Integer d = 321;
System.out.println(a == b);
System.out.println(c == d);
true
false
== 运算符在次判断a 和 b 是否指向同一个对象
b 执行了 自动装箱操作 c没有执行自动装箱操作
当我们的值在 -128 ~ 127之间时 系统首先到缓冲池中寻找是否存在该值对应的对象 如果存在 则将对象直接赋给b(d)如果不存在则重新建立一个新的对象赋给b(d)。
自动拆箱
我们依然以int ——> Integer 为例
自动拆箱就是将包装成Integer类型的数据拆箱成int类型的数据
Integer a = 1;
Integer b = 2;
Integer c = 3;
System.out.println(c == (a+b));
//当进行 a+b运算时 系统自动进行了拆箱操作
//a+b == a.intValue()+b.intValue();
//将 a b 均拆为 int进行运算 两个int相加还是int
//‘==’运算符进行等值运算所以将 c 也拆箱 拆为 int 类型进行比较
//c.intValue() == (a.intValue()+b.intValue();
//在此比较的就是 c 和 a+b 的值的大小
System.out.println(c.equals(a+b));
//大致相同 不同的是 equals 运算符是 等价运算
//所以将 a+b 的值进行自动装箱
//c.equals(Integer.valueOf(a.intValue()+b.intValue());
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a+b));
System.out.println(c.equals(a+b));
System.out.println(g == (a+b));
true
false
true
true
true