为了活动小家电-关于 JVM 中的自动装箱和拆箱以及缓存(一)

78 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的14天,点击查看活动详情

自动装箱与拆箱

自动装箱是指 Java 编译器在基本类型和它们的对象包装类之间执行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换在另一个方向进行,这称为拆箱。

考虑以下简单的自动装箱示例:

Character ch = 'a';

'a' 的类型是 char,分配给 Character。这仍然是兼容的,这是自动装箱。

让我们看看下面的示例代码。

List<Integer> list = new ArrayList<>(); 
for (int i = 1; i < 70; i += 2) 
    list.add(i);

即使您将 int 值作为基本类型而不是 Integer 对象添加到 li,代码也会编译。由于 li 是一个 Integer 对象列表,而不是一个 int 值列表,人们可能想知道 Java 编译器是否会引发编译时错误。但是由于编译器从 i 创建了一个 Integer 对象并将该对象添加到 li,所以它不会抛出错误。

因此,编译器在运行时将上述代码转换为以下代码。

List<Integer> list = new ArrayList<>(); 
for (int i = 1; i < 70; i += 2) 
    list.add(Integer.valueOf(i));

如上例所示,将原始类型的值更改为适当的包装类的类型称为自动装箱

让我们看另一个示例代码。

public static int dododo(List<Integer> list) {
    int sum = 0; 
    for (Integer i: list) 
        if (i % 2 == 0) 
            sum += i;
        return sum;
}

'%' 运算符和 '+=' 运算符通常不适用于对象,因此您可能想知道编译器如何做到这一点而不会出错。编译器如下调用 intValue 方法,在运行时将 Integer 转换为 int。

public static int dododo(List<Integer> list) {
    int sum = 0; 
    for (Integer i: list) 
        if (i.intValue() % 2 == 0)
            sum += i.intValue();
        return sum;
}

将包装类类型的对象更改为原始类型的值称为拆箱

自动装箱和拆箱允许开发人员编写更简洁的代码,使其更易于阅读。下面列出了 Java 编译器用于自动装箱和拆箱的原始类型及其包装类。

  • boolean <-> Boolean
  • byte <-> Byte
  • char <-> Character
  • float <-> Float
  • int <-> Integer
  • long <-> Long
  • short <-> Short
  • double <-> Double

为了活动小家电,下篇接着搞!