自 JDK 1.5 起,Java 引入自動裝箱與拆箱機制,讓基本型別與其包裝類別之間能自動轉換,極大簡化了程式碼撰寫。本文將深入探討其運作原理、享元模式快取行為及常見陷阱。
Integer num = 10; 編譯器轉為 Integer num = Integer.valueOf(10);。int n = num; 編譯器轉為 int n = num.intValue();。為了效能,Integer.valueOf() 對 -128 到 127 之間的整數採用快取策略,回傳同一物件實例;超出此範圍則每次建立新物件。
Integer a = 100, b = 100;
System.out.println(a == b); // true(快取)
Integer c = 200, d = 200;
System.out.println(c == d); // false(新物件)
注意:直接使用 new Integer(100) 總是建立新物件,不會使用快取。
八大基本型別皆有對應包裝類別支援自動裝箱/拆箱:
| 基本型別 | 包裝類別 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| short | Short |
| char | Character |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
Integer i = 10; System.out.println(i + 5); → 先拆箱相加,結果為 int。i++ 會拆箱、遞增、再裝箱回原變數。Boolean b = true; b && false 會先拆箱為 boolean。String s = "abc"; 使用字串常數池,類似享元模式;new String("abc") 則強制建立新物件。字串為不可變類別,編譯器優化較多。
Method.invoke 參數處理)。.equals(),勿用 ==(除非確定在快取範圍內)。null 拆箱會拋出 NullPointerException。