自動裝箱/拆箱本質是編譯器插入的 Integer.valueOf(int) / Integer.intValue() 呼叫。**頻繁裝箱會產生大量短命物件,增加 GC 壓力;拆箱則可能拋出 NullPointerException。**
// 反例:每次 i++ 產生新 Integer 物件
Integer sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i; // 拆箱 → 加法 → 裝箱
}
// 正解:使用基本型別累加
int sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i;
}
// 需放入集合時再裝箱
list.add(sum);
// 反例:每次 put 產生新 Integer
Map counter = new HashMap<>();
for (String word : words) {
Integer count = counter.get(word);
counter.put(word, (count == null) ? 1 : count + 1); // 拆箱+裝箱
}
// 正解:使用可變長整數或原子類別
Map counter = new HashMap<>();
for (String word : words) {
counter.computeIfAbsent(word, k -> new AtomicInteger()).incrementAndGet();
}
// 或 JDK 8+ Map.merge
counter.merge(word, 1, Integer::sum);
遞迴深度大時,每層裝箱/拆箱疊加,堆疊記憶體與 GC 雙重壓力。
Integer i = 1;
Integer j = i;
System.out.println(i == j); // true(快取池 -128~127)
i++;
System.out.println(i == j); // false!i 變新物件,j 仍指向舊物件
System.out.println(i); // 2
System.out.println(j); // 1
**關鍵認知**:++/--、四則運算**永遠產生新物件**,不修改原物件。
int/long/doubleInteger.valueOf(int):-128~127 走快取,**優於 new Integer()**LongAdder/DoubleAdder(JDK 8+):高並發計數器,分段累加,效能遠優於 AtomicLongCollections.singletonList 等避免裝箱當集合大小極大且頻繁存取基本型別值:
IntList、IntIntMap 等無裝箱結構AtomicInteger/LongAdder/merge?自動裝箱/拆箱是語法糖,**非零成本抽象**。理解其編譯器展開行為、包裝類型不可變性、快取機制,並在熱點路徑採用基本型別或專用優化結構,才能寫出高效能 Java 程式碼。