三種創建方式
new Boolean(true):每次創建新對象
Boolean.valueOf(true):返回常量池單例 Boolean.TRUE/FALSE
Boolean b = true;:自動裝箱,編譯器轉為 Boolean.valueOf()
身份比較實驗
Boolean[] a1 = new Boolean[100];
Boolean[] a2 = new Boolean[100];
Boolean[] a3 = new Boolean[100];
for (int i=0; i<100; i++) a1[i] = Boolean.valueOf(true);
for (int i=0; i<100; i++) a2[i] = new Boolean(true);
for (int i=0; i<100; i++) a3[i] = true; // 自動裝箱
System.out.println("valueOf: " + (a1[0] == a1[1])); // true
System.out.println("new: " + (a2[0] == a2[1])); // false
System.out.println("auto: " + (a3[0] == a3[1])); // true
結果分析
- valueOf/自動裝箱:復用
Boolean.TRUE/FALSE 靜態常量,== 為 true,節省內存、減少 GC 壓力
- new Boolean():每次在堆上分配新對象,
== 為 false,浪費內存、增加 GC
源碼佐證
// Boolean.valueOf 源碼 (JDK 8)
public static Boolean valueOf(boolean b) {
return b ? TRUE : FALSE; // 直接返回靜態常量
}
// 自動裝箱編譯後等同於 valueOf 調用
最佳實踐
- 優先使用
Boolean.valueOf() 或直接賦值(自動裝箱)
- 避免
new Boolean(),除非極少數需要區分對象身份的場景
- 同理適用於
Integer(-128~127 緩存)、Long、Short、Byte、Character(0~127 緩存)
- 集合存儲大量 Boolean 時,考慮
BitSet 或原始類型數組 boolean[] 更節省空間
性能數據參考
| 操作 | 100萬次耗時 | 內存分配 |
| Boolean.valueOf(true) | ~5ms | 0 Byte(常量復用) |
| new Boolean(true) | ~45ms | ~16MB(對象頭+字段) |