原文链接:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
一、Autoboxing
Autoboxing是java编译器提供的一种从原始类型到对应包装类型(wrapper classes)的自动转换功能。如int转Integer,double转Double等。如果从包装类型转为原始类型,则称为Unboxing。
一个最简单的autoboxing的例子:
Character ch = 'a';
还有一些autoboxing是泛型编程(Generics/Updated)实现的,如:
List li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(i);
由于li是Integer对象的列表,而不是int的列表,此时编译器通过每个i创建一个Integer的对象并加入li中,所以实际的过程可以表示如下:
List li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(Integer.valueOf(i)); 其中 int 型的 i 转化为 Integer 对象的过程就称为autoboxing。
Java编译器在如下情况下会采用autoboxing:
1. 在方法传参时,一个原始类型的实际参数被传给了一个需要相应包装类对象的形式参数;
2. 一个原始类型的值被赋给了其相应的包装类。
二、Unboxing
考虑如下情况:
public static int sumEven(List li) {
int sum = 0;
for (Integer i: li)
if (i % 2 == 0)
sum += i;
return sum;
}
由于Integer对象不具有取模%和+=操作符,此时编译器在运行时会将Integer转换为int,该过程即unboxing。所以实际过程如下:
public static int sumEven(List li) {
int sum = 0;
for (Integer i : li)
if (i.intValue() % 2 == 0)
sum += i.intValue();
return sum;
}
Java编译器在如下情况下会采用unboxing:
1. 在方法传参时,一个包装类对象的实际参数被传给了一个需要相应原始类型的形式参数;
2. 一个包装类对象的值被赋给了其相应的原始类型。
import java.util.ArrayList;
import java.util.List;
public class Unboxing {
public static void main(String[] args) {
Integer i = new Integer(-8);
// 1. Unboxing through method invocation
int absVal = absoluteValue(i);
System.out.println("absolute value of " + i + " = " + absVal);
List ld = new ArrayList<>();
ld.add(3.1416); // Π is autoboxed through method invocation.
// 2. Unboxing through assignment
double pi = ld.get(0);
System.out.println("pi = " + pi);
}
public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
总结:
Autoboxing和Unboxing使得开发者的代码更加简洁易读,下表为autoboxing和unboxing中常用的对应转换。
Primitive typeWrapper classbooleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble