在講裝箱與拆箱以前咱們要先了解一下這個問題的來源:編程
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能夠用來實現什麼和它不能作些什麼。