所谓的拆箱装箱,其实就是一个简单的语法糖。我们以Integer为?。
(一)装箱
Integer i = 1;
本质上就是:
Integer i = Integer.valueOf(1);
(二)拆箱
int m = i;
本质上就是:
int m = i.intValue();
(三)小练习
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
// 返回true:c和d都为-128~127期间的数值,
// 处于这个期间的数值会被缓存起来,
// 所以c和d指向的是同一个对象。
System.out.println(c == d);
// 返回false:e和f分别在堆中创建了不同的对象。
System.out.println(e == f);
// 返回true:在算数运算时包装类型会自动拆箱,
// 所以(a+b)相当于(a.intValue()+b.intValue()),
// 同时()的存在并不会触发装箱,所以(a+b)的结果为基本类型,
// 此时c也会被迫拆箱,所以3=3返回true
System.out.println(c == (a + b));
// 返回true,这个不用解释
System.out.println(c.equals(a + b));
// 返回true,这个和上面的道理基本一样,
// g也会被迫拆箱,而基本类型long和int可以直接比较数值,
// 所以返回true。
System.out.println(g == (a + b));
// 返回false,这个主要是因为equals的内部逻辑,
// 它会先判断是不是Long类型,是的话才会拆箱比较,
// 否者直接返回false。
System.out.println(g.equals(a + b));
}