看过.NET基础的朋友可能对这个装箱和拆箱的概念并不陌生。首先,我们必须明确一点,在Java中,有两种截然不同的数据类型:值类型和引用类型。值类型的数据不是对象,因而所占的内存和资源都相对较少,但是不能作为对象调用其toString()、hashCode()、getClass()、equals()等等方法,也不能被直接加入到集合中;引用类型的数据是一个一个的对象,占用内存和资源较多,但是提供丰富的访问方法,同时作为真正的对象,可以直接放入集合。
所谓装箱,就是把值类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。
所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。
在J2SE 5.0发布之前,我们只能手工的处理装箱和拆箱,而现在,编译器可以帮我们自动地完成这些必要的步骤。下面的代码我提供两个版本的装箱和拆箱,一个版本使用手工的方式,另一个版本则把这些显而易见的代码交给编译器去完成:
public static void manualBoxingUnboxing(int i) {
ArrayList<Integer> aList = new ArrayList<Integer>();
aList.add(0, new Integer(i));
int a = aList.get(0).intValue();
System.out.println("The value of i is " + a);
}
public static void autoBoxingUnboxing(int i) {
ArrayList<Integer> aList = new ArrayList<Integer>();
aList.add(0, i);
int a = aList.get(0);
System.out.println("The value of i is " + a);
}
看到了吧,在J2SE 5.0中,我们不再需要显式的去将一个值类型的数据转换成相应的对象,从而把它作为对象传给其他方法,也不必手工的将那个代表一个数值的对象拆箱为相应的值类型数据。当然,这里有一个问题必须要做一些说明:对于值类型和引用类型,在资源占用上,还是有明显区别的,在使用这一方便特性的同时,不要简单的忘记了它们本质上的不同。
有关J2SE 5.0自动装箱和拆箱详细介绍,参考这里。
本文地址:http://com.8s8s.com/it/it12249.htm