標籤: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-裝箱和拆箱