携手创作,共同成长!这是我参与「掘金日新计划 · 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
为了活动小家电,下篇接着搞!