自动装箱和拆箱自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换,例如,将int转换为Integer,将double转换为Double,依此类推,如果转换是另一种方式,则称为拆箱。以下是自动装箱的最简单示例:Character ch = ‘a’;本节中的其余示例使用泛型,如果您还不熟悉泛型的语法,请参阅泛型课程。考虑以下代码:List<Integer> li = new ArrayList<>();for (int i = 1; i < 50; i += 2) li.add(i);虽然你将int值作为基本类型而不是Integer对象添加到li,但代码会进行编译,因为li是Integer对象的列表,而不是int值列表,你可能想知道为什么Java编译器不会发出编译时错误,编译器不会生成错误,因为它从i创建一个Integer对象并将该对象添加到li,因此,编译器在运行时将前面的代码转换为以下代码:List<Integer> li = new ArrayList<>();for (int i = 1; i < 50; i += 2) li.add(Integer.valueOf(i));将原始值(例如int)转换为相应包装类(Integer)的对象称为自动装箱,Java编译器应用自动装箱,当原始值是:作为参数传递给期望相应包装类的对象的方法。分配给相应包装类的变量。考虑以下方法:public static int sumEven(List<Integer> li) { int sum = 0; for (Integer i: li) if (i % 2 == 0) sum += i; return sum;}因为余数(%)和一元加号(+=)运算符不适用于Integer对象,你可能想知道为什么Java编译器编译该方法而不发出任何错误,编译器不会生成错误是因为它在运行时调用intValue方法将Integer转换为int:public static int sumEven(List<Integer> li) { int sum = 0; for (Integer i : li) if (i.intValue() % 2 == 0) sum += i.intValue(); return sum;}将包装类型(Integer)的对象转换为其对应的原始(int)值称为拆箱,Java编译器应用拆箱,当包装类的对象是:作为参数传递给期望相应基元类型的值的方法。分配给相应基元类型的变量。Unboxing示例显示了其工作原理: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<Double> 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; }}该程序打印以下内容:absolute value of -8 = 8pi = 3.1416自动装箱和拆箱使开发人员可以编写更清晰的代码,使其更易于阅读,下表列出了原始类型及其相应的包装类,Java编译器使用这些类进行自动装箱和拆箱:原始类型包装类booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble上一篇:StringBuilder类