Java中自動裝箱與拆箱詳解

在講裝箱與拆箱以前咱們要先了解一下這個問題的來源:編程

 

Java中的類型分爲基本類型(Primitive type)和類類型(Class type)兩種:緩存

 

基本類型包括byte型、char型、short型、int型、long型、float型、double型、boolean型八種。基本類型指的是直接包含值得類型,可提供語言級別的支持。app

 

類類型包括Byte、Character、Short、Integer、Long、Float、Double、Boolean。爲何要用類類型呢?緣由其實很簡單,由於Java是一種面向對象的編程語言,因此操做對象是很總要的操做 ,而要產生對象就必須先定義類(類是對象的抽象,對象是類的實例),類類型提供了比基本類型更多的操做。編程語言

在Java版本增長自動裝箱與拆箱操做以前,若是要讓基本類型像對象同樣操做,就要對基本類型進行打包處理,Long、Integer、Double、Float、Boolean等類就是所謂的打包器(Wrapper)。學習

如:int num=10;spa

     Integer wrapper=new Integer(num);    //打包基本類型;對象

而在Java1.5版本增長了自動裝箱與自動拆箱的功能,也就是說如今像Integer num=10;如今實際作的事情就是Integer num=new Integer(10);文檔

如:         Integer wrapper=10;   //自動裝箱;it

              int num=wrapper;     //自動拆箱;編譯

 

知道了什麼是自動裝箱和拆箱,咱們再來看看程序是如何進行自動裝箱和拆箱的。

實際上對於Integer num=10;程序會將代碼展開爲:Integer num=Integer.valueOf(100);

查看JDK可知valueOf()的操做內容:

public static Integer valueOf(int i){

       assert IntegerCache.high>=127;

           if(i>=IntegerCache.low&&i<=IntegerCache.high)

                return IntegerCache.cache[i+(-IntegerCache.low)];

        return new Integer(i);

}

簡單來講就是若是傳入的int在IntegerCache.low和IntegerCache.high之間,就看看前面的緩存中有沒有打包過相同的值,有就直接返回,沒有的話就建立新的Integer實例。

 

之因此要將這個是爲了引出使用「==」和「equals()」的問題,以下面的例子

Integer i1=200;

Integer i2=200;  //200超過IntegerCache.high默認值(127)

if(i1==i2){

   System.out.println("i1==i2");

}

else{

  System.out.println("i1!=i2");

}

編譯以後你會發現結果並不相等,因此別用==或!=來比較兩個對象實質內容值是否相等。

 

經過自動裝箱與拆箱這個問題,筆者體會到一方面是Java中對對象及其操做性的重要,另外一方面是在學習Java的過程當中要學會去看Java的一些原文檔,瞭解Java的實現原理,爲的是知道Java能夠用來實現什麼和它不能作些什麼。

相關文章
相關標籤/搜索