Java中的装箱与拆箱

装箱:

            一是因为Java是一种面向对象语言,而int、float、char等等的一些的基本数据类型,不具备调用方法的功能,但Java是面向对象语言,如果基本数据类型想调用Java中的方法,那么就需要创建一次对象,这非常麻烦,所以在JDK1.5之后Java中就自动封装了基本数据类型的对象方法,而且。共有八种,分别是

         int        Integer

         byte     Byte

         short    Short

         long      Long

         float      Float

         double  Double 

     char      Character

          boolean Boolean

          一句话解释,就是,如果想进行加减乘除等基本运算,就用基本数据类型,如果想象对象一样对数据类型进行操作,就用Integer类型。

     举例:

public class zhuangxiang {
    public static void main(String[] args) {
        Integer i= 10;
        System.out.println(i.toString());//正确,因为装箱过后就可以调用Object类中的方法   object类中的方法详情看下表。
        int ii=20;
        System.out.println(ii.toSting()); //不正确,因为int是基本数据类型,不能调用方法
     System.out.println(ii);//正确
 } }
//运行结果:报错

 

拆箱:

          有装箱,对应的就应该有拆箱,因为对象类型的数据类型必要时也需要进行基本运算,拆箱其实很简单,例如 :

      Integer  i =  10;

              int    n = i;

          这两句语句就完成了装箱与拆箱操作。下面通过几个题来详细了解一下。(在此感谢大佬Matrix海子提供免费支持,链接:https://www.cnblogs.com/dolphin0520/)

测试:

          下面我们来看下面代码的运行结果是什么://看图计算出下列代码会在输出生么结果!


public class zhuangxiang {
    public static void main(String[] args) {
        Integer i1 = 100;
        int      i = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        System.out.println(i1 == i2);
        System.out.println(i == i1);
        System.out.println(i3 == i4);
} }

 

  我们可能会输出 ture ,ture ,ture。再看答案之前我们应该思考为什么我们会得出这个结果(千万不要靠蒙呦),我们可能会认为i,i1,i2数值都相等,i3,i4也相等,所以他们会相等。其实不然,答案是

1 //是不是有意思不可思议
2 true
3 true
4 false
View Code

  看到答案之后是不是不太理解,我也一样,然后我去看官方API文档,文档上解释道:

//Interger的valueOf方法实现源代码

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }
View Code

  而其中IntegerCache类中的实现为:

private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }
View Code

       由此我们知道当Integer的值超过127,或者小于-128时会重新创建一个新的对象。由于Integer数值在区间[-128,127],所以i1和i2其实指的是统一对象,而i3,i4超过区间,所以指的不是同一对象。至于i 和 i2结果,是因为i和i2比较的是数值,而不是内存中的对象。

  应该注意的是,当我们用Integer进行加减法时,系统会自动进行拆装箱。例如:

package com.zhuangxiang;

public class zhuangxiang {
    public static void main(String[] args) {
        Integer ii = 100;
        ii += 200;
        System.out.println(ii);
    }
}

//反编译文件,

//package com.zhuangxiang;
//
//        import java.io.PrintStream;
//
//public class zhuangxiang
//{
//
//    public zhuangxiang()   
//    {
//    }
//
//    public static void main(String args[])
//    {
//        Integer ii = Integer.valueOf(100);
//        ii = Integer.valueOf(ii.intValue() + 200);
//        System.out.println(ii);
//    }
//}

由反编译文件,我们知道,当Integer类型的数字进行加法操作时,实际上是拆箱成int类型的数字进行加减法操作。

 

Attention:当Integer类型的变量赋值为null时,不能进行自动拆装箱。

public class zhuangxiang {
    public static void main(String[] args) {
        Integer ii = null;
        ii += 200;
        System.out.println(ii);
    }
}
  报错信息:Exception in thread "main" java.lang.NullPointerException//即空指针异常
at com.zhuangxiang.zhuangxiang.main(zhuangxiang.java:6),所以在使用Integer进行拆装箱时,不能给Integer类型的变量赋值为null。

 

详情:https://www.cnblogs.com/dolphin0520/p/3780005.html

 

 

   

 

posted @ 2019-04-23 17:12  LOL_toulan  阅读(193)  评论(0编辑  收藏  举报