首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

J2SE 5.0 自動裝箱/拆箱深度解析(四):自動拆箱觸發時機完整列表

     編輯:J2SE

自動拆箱七大觸發場景

當包裝類型物件出現在**需要基本型別值**的語境時,編譯器自動插入 xxxValue() 呼叫。

1. 指派給基本型別變數

Integer obj = Integer.valueOf(42);
int primitive = obj; // → obj.intValue()

2. 傳遞給基本型別參數

void process(boolean flag) { ... }
Boolean boxed = Boolean.TRUE;
process(boxed); // → boxed.booleanValue()

3. 強制轉型為基本型別

Long l = 31415L;
long primitive = (long) l; // → l.longValue()

4. 作為運算子運算元

Byte a = 1, b = -1;
int result = (a++ << 2) + (~b); // 每次運算元皆拆箱
// a++ 含拆箱→遞增→裝箱,複合運算更頻繁

5. 指定陣列長度

Character size = '★'; // Unicode 9733
int[] arr = new int[size]; // → size.charValue()

6. switch 陳述式判斷式

Character c = 'e';
switch (c) { // → c.charValue()
    case 'a': case 'e': case 'i': case 'o': case 'u':
        System.out.println("母音");
}

7. 控制流條件判斷

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) longObjlongObj.longValue()
運算a + ba.intValue() + b.intValue()
陣列長度new int[integerObj]integerObj.intValue()
switchswitch(charObj)charObj.charValue()
條件判斷if(booleanObj)booleanObj.booleanValue()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved