Java自动装箱/拆箱机制可能引发的问题

一、为什么要引入自动装箱

1. 基本类型与包装类型

我们已知Java的类型分为以下两种:
在这里插入图片描述
而在Java的使用中,由于Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将int 、double等类型放进去的,因为集合的容器要求元素是Object类型。
例如: List<Integer>而不是List<int>,这里需要的是 Integer 这样的引用类型,而不是 int 基本类型。
为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
Java核心库为每种基本类型都提供了对应的包装类型:
在这里插入图片描述
那么,有了基本数据类型和包装类型,肯定有些时候要在他们之间进行转换。比如把一个基本数据类型的int转换成一个包装类型的Integer对象。
手动进行转化代码如下:

int i = 100;
Integer n = Integer.valueOf(i);
int x = n.intValue();

2. 自动装箱/拆箱

由于基本类型和包装类型之间进行相互转化的这种需求很多,所以在Java SE5及以后的发展中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能。
自动装箱(Auto Boxing):直接把int变为Integer的赋值写法。
自动拆箱(Auto Unboxing):把Integer变为int的赋值写法。
那么就不需要我们显示的手动去转化:

Integer n = 100; // 编译器自动使用Integer.valueOf(int)
int x = n; // 编译器自动使用Integer.intValue()

3. 不变类

需要明确一点:所有的包装类型都是不变类。我们查看 Integer 的源码可知,它的核心代码如下:

public final class Integer {
   
    
    
    private final int value;
}

由 final 修饰,因此,一旦创建了Integer对象,该对象就是不变的,也可以理解为具有唯一的地址!
所以,对两个 Integer 实例进行比较要特别注意:绝对不能用 == 比较,因为 Integer 是引用类型,使用 == 拿到的是内存地址,必