Java - 自动装箱和拆箱
Java 自动装箱
自动装箱是 Java 编译器使用的一种技术,用于自动将原始值转换为其对应的包装类对象。例如,当将一个 int 值赋给 Integer 包装类对象时,编译器会自动将 int 值转换为对象,而无需显式地转换 int 值或调用任何方法来将 int 转换为 Integer 对象。自动装箱也被称为装箱。
// 自动装箱 Integer obj = 10; // 显式转换 Integer obj2 = Integer.valueOf(10)
在两种情况下,包装类对象都被初始化为一个 int 值。在第一种情况下,自动装箱起作用;在第二种情况下,我们显式地将 int 值转换为 Integer 包装类对象。
编译器在以下场景中使用自动装箱:
如果将原始值作为参数传递给期望包装类对象的函数。
如果将原始值赋给包装类类型的变量。
Java 中自动装箱的示例
在这个示例中,我们创建了一个 Integer 的列表,因为 List 只能包含对象。在向该列表添加项目时,我们没有创建任何 Integer 对象,而只是传递了原始的 int 值。Java 编译器自动处理了转换,程序成功编译。我们还使用了将 char 原始值赋给 Character 对象的另一个案例,这也同样有效。
package com.;
import java.util.ArrayList;
import java.util.List;
public class Tester {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for(int i = 0; i< 10; i++){
// 作为参数传递时的自动装箱
// int 值在编译期间被编译器转换为 Integer
list.add(i);
}
System.out.println(list);
char c = 'a';
//将 char 赋给 Character 对象的自动装箱
Character ch = c;
System.out.println(ch);
}
}
输出
让我们编译并运行上述程序,不带任何命令行参数,这将产生以下结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a
Java 拆箱
拆箱是自动装箱的反向过程。Java 编译器使用拆箱将包装对象转换为其对应的原始类型。例如,当一个 Integer 对象作为参数传递给一个方法,但该方法期望的是 int 变量时,编译器会自动将 Integer 对象转换为 int 值,然后传递给调用的方法。同样,如果将包装值赋给原始类型变量,Java 编译器也会进行拆箱。因此,我们无需显式地从包装对象中获取 int 值。
Integer obj = Integer.valueOf(10); // 拆箱 int i = obj; // 显式值提取 i = obj.intValue();
在两种情况下,原始值都用 int 值进行初始化。在第一种情况下,拆箱起作用;在第二种情况下,我们显式地从 Integer 包装对象中获取 int 值。
编译器在以下场景中使用拆箱 −
如果将包装类对象作为参数传递给期望原始值的函数。
如果将包装类对象赋给原始类型的变量。
Java 中拆箱的示例
在这个示例中,我们创建了一个 Integer 对象,并用 10 初始化它。这个对象被传递给 abs() 方法,该方法期望一个 int,即原始变量。Java 编译器自动处理转换,程序成功编译。我们还使用了另一种情况,即将 Integer 对象赋给 int 变量,这也同样有效。
package com.;
public class Tester {
public static void main(String[] args) {
Integer integer = Integer.valueOf(-10);
// 通过作为参数传递进行拆箱
// Integer 对象在编译期间被编译器转换为 int
int i = abs(integer);
System.out.println(i);
//通过将 Integer 对象赋给 int 变量进行拆箱
int j = integer;
System.out.println(j);
}
private static int abs(int i){
return (i < 0)? -i: i;
}
}
输出
让我们编译并运行上述程序,不带任何命令行参数,这将产生以下结果 −
10 -10
原始类型与包装对象的映射
| 序号 | 原始类型 | 包装类 | 获取值的方法 |
|---|---|---|---|
| 1 | byte | Byte | byteValue() |
| 2 | short | Short | shortValue() |
| 3 | int | Integer | intValue() |
| 4 | long | Long | longValue() |
| 5 | float | Float | floatValue() |
| 6 | double | Double | doubleValue() |
| 7 | char | Character | charValue() |
| 8 | boolean | Boolean | booleanValue() |