當包裝類型物件出現在**需要基本型別值**的語境時,編譯器自動插入 xxxValue() 呼叫。
Integer obj = Integer.valueOf(42);
int primitive = obj; // → obj.intValue()
void process(boolean flag) { ... }
Boolean boxed = Boolean.TRUE;
process(boxed); // → boxed.booleanValue()
Long l = 31415L;
long primitive = (long) l; // → l.longValue()
Byte a = 1, b = -1;
int result = (a++ << 2) + (~b); // 每次運算元皆拆箱
// a++ 含拆箱→遞增→裝箱,複合運算更頻繁
Character size = '★'; // Unicode 9733
int[] arr = new int[size]; // → size.charValue()
Character c = 'e';
switch (c) { // → c.charValue()
case 'a': case 'e': case 'i': case 'o': case 'u':
System.out.println("母音");
}
Boolean flag = Math.random() > 0.5;
if (flag) { ... } // → flag.booleanValue()
while (flag) { ... }
for (; flag; ) { ... }
do { ... } while (flag);
// 原始碼
Integer a = 10, b = 20;
int sum = a + b;
// 編譯器實際生成(等價)
Integer a = Integer.valueOf(10);
Integer b = Integer.valueOf(20);
int sum = a.intValue() + b.intValue();
Integer count = null;
if (count > 0) { ... } // 拋 NullPointerException 於 count.intValue()
// 防禦性寫法
if (count != null && count > 0) { ... }
// 或使用 Objects.requireNonNull / Optional
LongAdder/AtomicLong 內部用基本型別陣列/欄位,避免裝箱開銷| 語境 | 範例 | 編譯器插入 |
|---|---|---|
| 指派 | int i = integerObj; | integerObj.intValue() |
| 參數 | method(booleanObj) | booleanObj.booleanValue() |
| 轉型 | (long) longObj | longObj.longValue() |
| 運算 | a + b | a.intValue() + b.intValue() |
| 陣列長度 | new int[integerObj] | integerObj.intValue() |
| switch | switch(charObj) | charObj.charValue() |
| 條件判斷 | if(booleanObj) | booleanObj.booleanValue() |