Java 包裝類別 (Wrapper Class)
包裝類別將基本型別包裝成物件,讓基本型別可以用於需要物件的場合。
基本型別與包裝類別
| 基本型別 | 包裝類別 |
|---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
建立包裝物件
// 使用建構子(已棄用)
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
最佳實踐
- 優先使用基本型別:效能較好
- 使用 valueOf:而不是 new
- 比較用 equals:不要用
== - 注意 null:包裝類別可能為 null
- 避免不必要的裝箱:在迴圈中要小心
// 不好:大量裝箱
Long sum = 0L;
for (int i = 0; i < 100000; i++) {
sum += i; // 每次都裝箱
}
// 好:使用基本型別
long sum = 0L;
for (int i = 0; i < 100000; i++) {
sum += i;
}