Java 包裝類別 (Wrapper Class)

包裝類別將基本型別包裝成物件,讓基本型別可以用於需要物件的場合。

基本型別與包裝類別

基本型別包裝類別
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

建立包裝物件

// 使用建構子(已棄用)
Integer num1 = new Integer(10);

// 使用 valueOf(推薦)
Integer num2 = Integer.valueOf(10);
Integer num3 = Integer.valueOf("10");

// 自動裝箱
Integer num4 = 10;

自動裝箱與拆箱

Java 5+ 自動處理基本型別和包裝類別之間的轉換:

// 自動裝箱:基本型別 → 包裝類別
Integer num = 10;  // 自動呼叫 Integer.valueOf(10)

// 自動拆箱:包裝類別 → 基本型別
int n = num;  // 自動呼叫 num.intValue()

// 在運算中
Integer a = 5;
Integer b = 3;
int sum = a + b;  // 自動拆箱後相加

常用方法

字串轉換

// 字串 → 數字
int n1 = Integer.parseInt("123");
double d1 = Double.parseDouble("3.14");
long l1 = Long.parseLong("100000");

// 數字 → 字串
String s1 = Integer.toString(123);
String s2 = String.valueOf(123);
String s3 = 123 + "";

進位轉換

// 轉為二進位
String binary = Integer.toBinaryString(10);   // "1010"

// 轉為十六進位
String hex = Integer.toHexString(255);        // "ff"

// 轉為八進位
String octal = Integer.toOctalString(8);      // "10"

// 從其他進位轉換
int fromBinary = Integer.parseInt("1010", 2); // 10
int fromHex = Integer.parseInt("ff", 16);     // 255

比較

Integer a = 100;
Integer b = 100;
Integer c = 200;

// 比較
a.compareTo(b);  // 0(相等)
a.compareTo(c);  // 負數(a < c)

// equals
a.equals(b);     // true

最大值和最小值

System.out.println(Integer.MAX_VALUE);  // 2147483647
System.out.println(Integer.MIN_VALUE);  // -2147483648
System.out.println(Double.MAX_VALUE);   // 1.7976931348623157E308
System.out.println(Long.MAX_VALUE);     // 9223372036854775807

快取機制

Integer 會快取 -128 到 127 的值:

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true(同一個物件)

Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // false(不同物件)

// 比較值應該用 equals
System.out.println(c.equals(d));  // true

在集合中使用

// 基本型別不能直接用於泛型
// List<int> list;  // 錯誤

// 使用包裝類別
List<Integer> numbers = new ArrayList<>();
numbers.add(1);      // 自動裝箱
numbers.add(2);
numbers.add(3);

int first = numbers.get(0);  // 自動拆箱

null 處理

包裝類別可以是 null:

Integer num = null;

// 小心 NullPointerException
// int n = num;  // NullPointerException!

// 安全的處理
if (num != null) {
    int n = num;
}

// 或使用 Optional
Optional<Integer> opt = Optional.ofNullable(num);
int n = opt.orElse(0);

Character 方法

char c = 'A';

Character.isLetter(c);       // true
Character.isDigit(c);        // false
Character.isLetterOrDigit(c); // true
Character.isUpperCase(c);    // true
Character.isLowerCase(c);    // false
Character.isWhitespace(' '); // true

Character.toUpperCase('a');  // 'A'
Character.toLowerCase('A');  // 'a'

// 數字字元的值
Character.getNumericValue('5');  // 5

Boolean 方法

Boolean b = Boolean.valueOf(true);
Boolean b2 = Boolean.valueOf("true");

// 字串解析
Boolean.parseBoolean("true");   // true
Boolean.parseBoolean("TRUE");   // true(不分大小寫)
Boolean.parseBoolean("false");  // false
Boolean.parseBoolean("abc");    // false

最佳實踐

  1. 優先使用基本型別:效能較好
  2. 使用 valueOf:而不是 new
  3. 比較用 equals:不要用 ==
  4. 注意 null:包裝類別可能為 null
  5. 避免不必要的裝箱:在迴圈中要小心
// 不好:大量裝箱
Long sum = 0L;
for (int i = 0; i < 100000; i++) {
    sum += i;  // 每次都裝箱
}

// 好:使用基本型別
long sum = 0L;
for (int i = 0; i < 100000; i++) {
    sum += i;
}