Java中具有基本類型(int,double,float,long,boolean,char,byte,short)和基本類型包裝類(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我們實現基本類型與包裝類之間的轉換基本有兩種方式:
如果我們現在使用第二種方式進行直接賦值操作,代碼如下:
public class Demo { @Test public void demo() { Integer integer = 5; int i = new Integer(100); }}編寫完成的Java文件,在運行之前會被編譯成Class文件。現在我們將編譯后的Class文件,進行反編譯操作,得到如下代碼內容:
public class Demo { @Test public void demo() { Integer integer = Integer.valueOf(5); int i = new Integer(100).intValue(); }}通過查看反編譯的代碼內容,我們得知在Java文件編譯后的內容與第一種方式的操作保持一致。這就說明實際上Java中基本類型與包裝類之間的轉換,在JDK5之后不再由我們手動操作,而是由Java編譯器幫助我們來完成,與Java的虛擬機是沒有任何關系的。
底層原理分析到目前為止,我們已經基本掌握了Java5的自動裝箱與拆箱的內容。在實際開發中,目前基本使用的都是Java5之后的版本,所以自動裝箱與拆箱內容就不是那么重要了。 下面我們來看一個例子:
public class Demo { @Test public void demo2() { Integer i1 = 100; Integer i2 = 100; boolean b1 = i1 == i2; System.out.PRintln(b1); //output true Integer i3 = 200; Integer i4 = 200; boolean b2 = i3 == i4; System.out.println(b2); //output false }}在上面的例子中,變量Integer類型的i1,i2,i3和i4都是自動裝箱,但是最終比較的結果卻一個為true一個為false。這讓我們比較困惑,原因是什么呢?下面我們來還原一下自動裝箱,上面的代碼可以改寫成如下方式:
public class Demo { @Test public void demo3() { Integer i1 = Integer.valueOf(100); Integer i2 = Integer.valueOf(100); boolean b1 = i1 == i2; System.out.println(b1); //output true Integer i3 = Integer.valueOf(200); Integer i4 = Integer.valueOf(200); boolean b2 = i3 == i4; System.out.println(b2); //output false }}通過改寫之后的代碼,我們發現原來是Integer類型的valueOf()方法接收100和200返回的內容是不一樣的。那我們就需要看查看一下Integer類型的valueOf()方法的源代碼,它到底是怎么樣的。
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}通過查看源代碼我們發現,在Integer類的內部緩存了-128至127之間的256個Integer對象,如果valueOf()方法將這個范圍的int類型整數轉換成Integer對象時,會直接返回緩存中的內容,否則返回重新創建的Integer對象。 所以,在上面的例子中,整數100在Integer類的緩存之中,所以直接返回緩存內容。而整數200不在Integer類的緩存之中,所以需要重新創建Integer對象返回。而兩個Integer類型的對象做比較,是判斷對象地址是否相同,所以一個結果為true一個結果為false。
轉載說明:請注明本文作者及原文連接,謝謝!
新聞熱點
疑難解答