java-裝箱和拆箱

來源:互聯網
上載者:User

標籤:code   return   oat   ges   har   static   不同   string   兩種   

一、什麼是裝箱拆箱?

  java為每種基礎資料型別 (Elementary Data Type)提供了對應的封裝器類型

Integer i = 10;

拿煙的手微微顫抖:這樣就產生了一個特數值為10的Integer對象,這個過程中會自動建立對應的Integer對象。

 

  name什麼是拆箱呢?

Integer i = 10;//裝箱int n = i;//拆箱

總結:

  裝箱就是把自動基礎資料型別 (Elementary Data Type)裝換為封裝器類型,拆箱就是自動將封裝器類型轉換成基礎資料型別 (Elementary Data Type)。

 

下面是基本類型對應的封裝器類型:

  int(4位元組)             Integer

   byte(1位元組)          Byte

   short(2位元組)        Short

   long(8位元組)          Long

   float(4位元組)          Float

   double(8位元組)      Double

   char(2位元組)          Character

   boolean(未定)      Boolean

 

二、實現原理

看段代碼:

 

 1 package cn.zpoor.test; 2 /** 3  * @author 薛定諤的貓 4  * 自動裝箱拆箱*/ 5 public class Main { 6     public static void main(String[] args) { 7         Integer i = 10; 8         int n = i; 9     }10 }

 

jd反編譯之後:

 

 

不要慌,冷靜分析:在裝箱的時候自動調用的是Integer的valueOf()方法,拆箱的時候是自動調用Integer的intValue()方法。

 

總結:裝箱過程是通過調用封裝器的valueOf方法實現,拆箱過程是通過調用封裝器的xxxValue方法實現的(xxx代表基礎資料型別 (Elementary Data Type))

 

 

三、裝箱和拆箱的面試問題

 

1、這段代碼輸出的是什嗎?

 

 1 package cn.zpoor.test; 2 /** 3  * @author 薛定諤的貓 4  * 自動裝箱拆箱*/ 5 public class Main { 6     public static void main(String[] args) { 7         Integer i1 = 100; 8         Integer i2 = 100; 9         Integer i3 = 200;10         Integer i4 = 200;11         12         System.out.println(i1 == i2);13         System.out.println(i3 == i4);14     }15 }16 17 18 /*結果:19  *         true20         false21  */

為什麼呢?

看一段源碼:

1  public static Integer valueOf(int i) {2         if (i >= IntegerCache.low && i <= IntegerCache.high)3             return IntegerCache.cache[i + (-IntegerCache.low)];4         return new Integer(i);5     }

 

在通過valueOf方法建立Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象,否則建立一個新的對象。

所以i1和i2是一個對象,i3和i4則指向不同的對象。

 

2、這段代碼輸出什嗎?

 1 package cn.zpoor.test; 2 /** 3  * @author 薛定諤的貓 4  * 自動裝箱拆箱*/ 5 public class Main { 6     public static void main(String[] args) { 7         Double i1 = 100.0; 8         Double i2 = 100.0; 9         Double i3 = 200.0;10         Double i4 = 200.0;11         System.out.println(i1 == i2);12         System.out.println(i3 == i4);13     }14 }15 16 17 /*結果:18  *         false19         false20  */

 

為啥呢?

    因為Double封裝器的valueOf方法返回的是一個新的對象,所以每個對象都不一樣。還是一句話,多看看源碼。

 

 

3、這段代碼輸出什嗎?

 1 package cn.zpoor.test; 2 /** 3  * @author 薛定諤的貓 4  * 自動裝箱拆箱*/ 5 public class Main { 6     public static void main(String[] args) { 7         Boolean i1 = false; 8         Boolean i2 = false; 9         Boolean i3 = true;10         Boolean i4 = true;11         System.out.println(i1 == i2);12         System.out.println(i3 == i4);13     }14 }15 16 17 /*結果:18  *         true19  *         true20  */

 

冷靜分析:

  看源碼  

public static Boolean valueOf(boolean b) {
  return (b ? TRUE : FALSE);
}

 

我這樣說,你大概懂了吧。

 

4、談談Integer i = new Integer(xxx) 和 Integer i = xxx; 這兩種方式的區別?

 

  一:第一種方式不會觸發自動裝箱的過程;第二種方式會觸發。

  二:在執行效率和資源佔用的區別。第二種方式的執行效率和資源佔用在一般性情況下優於第一種情況(但不是絕對的)

 

分析完畢之後:拿煙的手,微微顫抖。

 

java-裝箱和拆箱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.