浅谈Java拆箱、装箱

java语言规范中说道:在许多情况下装箱与解拆箱是由编译器自行完成的。

自动装箱:自动将基本数据类型封装为对象(包装器)类型,

自动拆箱:就是自动将对象(包装器)重新转化为基本数据类型:

例如用int来举例:

//装箱
Integer i= 10; 相当于Integer i= new Integer(10);
//拆箱 int n = i;

经反编译器反编译可以得出结论:

    在装箱的时候自动调用的是Integer的valueOf(int)方法。

(valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例对象)

    而在拆箱的时候自动调用的是Integer的intValue方法。

(intValue()以 int 类型返回该 Integer 的值) 

经典面试题1:

    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 200;
    Integer i4 = 200;
    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;
         
    System.out.println(i1==i2);
    System.out.println(i3==i4);
    System.out.println(i1==i2);
    System.out.println(i3==i4);

输出结果:true false false false

原因:对于前两个结果:int 输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。通过原码中的对象以及类中定义:valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否   则创建一个新的Integer对象。所以..

对于Double: 在某个范围内的整型数值的个数是有限的,而浮点数却不是

经典面试题2:

谈谈Integer i = new Integer(1)和Integer i =1;这两种方式的区别:

1,第一种方式不会触发自动装箱的过程;而第二种方式会触发;

2,在执行效率和资源占用上的区别。第二种方式的执行效率和资源占用在一般性情况下要优于第一种情况

 

总结:装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 IntValue方法实现的。

注:

     int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别:int 是基本类型,直接存数值,integer是对象,用一个引用指向这个对象

     类似的还有:float Float;double Double;string String等,而且还提供了处理 int 类型时非常有用的其他一些常量和方法

posted @ 2015-05-30 23:58  帅少1993  阅读(263)  评论(0编辑  收藏  举报