动装箱与自动装箱何时发生
将一个基本类型赋值给对象包装器对象,就会发生自动装箱。比如:
List<Integer> list = new ArrayList<>();
// 此处发生自动装箱:相当于 list.add(Integer.valueOf(3))
list.add(3);
将一个包装器对象赋值给基本类型,就会发生自动拆箱。比如
List<Integer> list = new ArrayList<>();
// 此处发生自动装箱:相当于 list.add(Integer.valueOf(3))
list.add(3);
// 此处发生自动拆箱:相当于 list.get(0).intValue();
list.get(0);
对象包装器对象之间的比较
由于自动装箱和自动拆箱,使我们觉得对象包装器对象之间的比较,好像使用 == 运算符也可以,== 运算符运用在对象之间,
实际是比较对象是否指向同一个内存区域。那么我们猜测一下,下面代码运行的结果是多少:
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 == i2);
Integer i3 = 300;
Integer i4 = 300;
System.out.println(i3 == i4);
Integer i5 = new Integer(100);
Integer i6 = new Integer(100);
System.out.println(i6 == i5);
————————————————
true
false
false
自动装箱规范要求 boolean、byte、char <= 127,介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中。(此句话出自 Java 核心技术卷 1 的 185 页)
所以 i1 和 i2 其实指向的是一个对象,所以为 true。i3 与 i4 指向的是两个对象,所以为 false。而 i5 和 i6 不是自动装箱,属于手动装箱,所以不遵守自动装箱规范,也是两个对象,所以为 false。