Effective Java Item 61:能用原始型別就不要用 boxed primitives
主旨
Java 有兩套型別系統:原始型別(primitive)與其對應的物件型別(boxed primitive)。例如:
int↔Integerdouble↔Doubleboolean↔Boolean
雖然 autoboxing 看似無縫,但事實上這兩種型別在「效能、null 安全性、== 比較」上都有重大差異。
原則很簡單:如果可以用 primitive,就不要用 boxed。
點出問題:== 比較失準、NullPointerException、效能變慢
錯誤範例一:== 比較 boxed primitive,會比較「物件身份」不是值!
原因是 (i == j) 比較的是兩個 Integer 的物件身份(reference),不是值。正確寫法:
錯誤範例二:boxed primitive 的預設值是 null,小心 NPE
解法很簡單:用 int 取代 Integer,就不會有 null 值。
錯誤範例三:不小心用 boxed 會讓效能變慢
上面程式會慢非常多,只因為 sum 用的是 Long 而非 long。修正如下:
小結:何時該用 boxed?何時避免?
| 用途說明 | 選擇 |
|---|---|
| 效能重要、控制 null 安全 | ✅ 用 primitive |
需要放進集合(如 List) | ✅ 用 boxed primitive |
泛型的類型參數(如 ThreadLocal<Integer>) | ✅ 用 boxed primitive |
| 反射操作需要物件 | ✅ 用 boxed primitive |
劃重點
int、long等 primitive → 無 null、無 GC 負擔、比 boxed 更快Integer、Long是物件 → 會有 null,也會被==誤判為不同值- autoboxing 不會解決風險,只是語法糖
- 避免用
==比較 boxed primitive - 避免讓 boxed primitive 預設值是 null
✅ 實務原則:能用 primitive,就用 primitive。boxed 是不得已才用的備案!
Read other posts