Jdk5 中的装箱与拆箱

在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中,我们不再需要显式的去将一个值类型的数据转换成相应的对象,从而把它作为对象传给其他方法,也不必手工的将那个代表一个数值的对象拆箱为相应的值类型数据。当然,这里有一个问题必须要做一些说明:对于值类型和引用类型,在资源占用上,还是有明显区别的,在使用这一方便特性的同时,不要简单的忘记了它们本质上的不同。

 

ps:

下面给个例子让大家

 

public class Test {
        public static void main(String args[]){
                Integer m = new Integer(5);
                Integer n = new Integer(5);
                System.out.println(m==n);
                m = m-1;
                n = n-1;
                System.out.println(m==n);
        }
}

 

输出结果false true

 

先 false,后 true。

第一次比较:

比较两个不同对象地址,显然是 false。

第二次比较:

JDK 5 有自动拆箱和装箱的功能。

当进行 -1 运算后,m,n 将自动拆箱为原始类型,==为内容比较,而不是地址比较。

内容上,4 == 4,所以 true。

提醒:

这种操作只对 -128-127 值有效。

如果把 m,n 初始值换为 500,运行结果就两个都是 false 了。
另外一个例子
public class Test2 {

    public static void main(String[] args) {

       Integer i1 = 256;

        Integer i2 = 256;

        if (i1 = = i2) 

        System.out.println("相等!");

        else

        System.out.println("不相等!");

    }

} 
 
结果输出的是“不相等!”,两个对象比较,它们在内存中开辟的是两个地址怎么能相等呢?

    警告:你可千万不能依赖这个结果,请把i1和i2的值,改成100.(请看Test3.java)看看什么结果,令人惊讶的是改了个数,居然输出了“相等!”。

    这是因为JVM可以选择要尝试这段代码的最佳优化,并对两个Integer对象使用一个实例,这样的话“= =”就会返回true了。在自动装箱时对于值从–128到127之间的值,使用一个实例。

转载地址:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值