八大基本型別總覽
| 分類 | 型別 | 位元數 | 預設值 | 範圍 / 說明 |
| 整數 | byte | 8 | 0 | -128 ~ +127 |
| short | 16 | 0 | -2¹⁵ ~ +2¹⁵-1 |
| int | 32 | 0 | -2³¹ ~ +2³¹-1 |
| long | 64 | 0L | -2⁶³ ~ +2⁶³-1 |
| 浮點數 | float | 32 | 0.0f | IEEE 754 單精度 |
| double | 64 | 0.0 | IEEE 754 雙精度(預設) |
| 字元 | char | 16 | '\u0000' | Unicode 字元,0 ~ 65535 |
| 布林 | boolean | 1 (JVM 實作相關) | false | true / false |
關鍵補充說明
- ^ 符號:表格中 ^ 代表次方(如 2^31 = 2 的 31 次方)
- char 佔 2 位元組:Java 採用 UTF-16,一個 char 代表一個 Unicode 代碼單元
- boolean 無具體大小:JVM 實作時通常佔 1 位元組或 4 位元組
- void:非資料型別,僅用於方法回傳值宣告
對應包裝類別
| 基本型別 | 包裝類別 | 建構子(已棄用) | 靜態工廠方法(建議) |
| byte | Byte | new Byte((byte)0) | Byte.valueOf((byte)0) |
| short | Short | new Short((short)0) | Short.valueOf((short)0) |
| int | Integer | new Integer(0) | Integer.valueOf(0) |
| long | Long | new Long(0L) | Long.valueOf(0L) |
| float | Float | new Float(0.0f) | Float.valueOf(0.0f) |
| double | Double | new Double(0.0) | Double.valueOf(0.0) |
| char | Character | new Character('a') | Character.valueOf('a') |
| boolean | Boolean | new Boolean(false) | Boolean.valueOf(false) |
特殊高精度類別(無對應基本型別)
- BigInteger:任意精度整數運算
- BigDecimal:任意精度浮點數運算(金融計算必備)
基本型別 vs 包裝類別 差異比較
| 維度 | 基本型別 | 包裝類別 |
| 物件本質 | 非物件 | 物件(繼承 Object) |
| 宣告方式 | 無需 new | 需 new 或 valueOf() |
| 儲存位置 | 堆疊(區域變數) | 堆積(物件實例),變數存參考 |
| 預設值 | 型別相關(0, false 等) | null |
| 集合框架 | 不可直接使用 | 可存入 List/Map/Set |
| Null 語意 | 無法表達「無值」 | 可表達 null |
| 效能 | 高(直接存取) | 較低(物件建立、GC、間接存取) |
自動裝箱與拆箱
// 裝箱:基本型別 → 包裝類別
Integer i = 100; // 編譯器轉為 Integer.valueOf(100)
List list = new ArrayList<>();
list.add(100); // 自動裝箱
// 拆箱:包裝類別 → 基本型別
int j = i; // 編譯器轉為 i.intValue()
int sum = list.get(0) + 200; // 自動拆箱運算
// 注意:null 拆箱會拋出 NullPointerException
Integer k = null;
int m = k; // NPE at runtime
Integer 快取機制
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true (-128 ~ 127 範圍內快取)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false (超出快取範圍,新建物件)
// 建議:比較包裝類別數值一律使用 .equals()
System.out.println(c.equals(d)); // true
最佳實務建議
- 優先使用基本型別:區域變數、效能敏感運算、大量資料處理
- 集合、泛型、需表達 null 時用包裝類別
- 避免在迴圈中頻繁裝箱/拆箱:造成大量臨時物件、GC 壓力
- 比較包裝類別用 .equals(),不要用 ==
- 金融/精度計算務必用 BigDecimal,嚴禁 float/double
- 方法參數/回傳值:考慮 null 語意選擇基本型別或包裝類別
總結
理解基本型別與包裝類別的差異、記憶體模型、自動裝箱拆箱機制,是寫出高效能、無 Bug Java 代碼的基礎。合理選擇型別,平衡效能與表達力。