1. 程式人生 > >Java中自動裝箱與拆箱詳解

Java中自動裝箱與拆箱詳解

sans 做的 sys 實例 代碼 而在 byte 裝箱 bsp

在講裝箱與拆箱之前我們要先了解一下這個問題的來源:

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

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

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

在Java版本增加自動裝箱與拆箱操作之前,如果要讓基本類型像對象一樣操作,就要對基本類型進行打包處理,Long、Integer、Double、Float、Boolean等類就是所謂的打包器(Wrapper)。

如:int num=10;

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

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

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

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可以用來實現什麽和它不能做些什麽。

Java中自動裝箱與拆箱詳解