| 來源類型 | 目標類型 | 推薦方式 | 備註 |
|---|---|---|---|
| String | int | Integer.parseInt(str) | 拋 NumberFormatException,高性能 |
| String | Integer | Integer.valueOf(str) | 返回包裝類,利用緩存池(-128~127) |
| int | String | String.valueOf(i) | null 安全,效率最高 |
| int | Integer | Integer.valueOf(i) | 自動裝箱,優先用緩存 |
| Integer | int | integer.intValue() | 自動拆箱,注意 NPE |
| String | long | Long.parseLong(str) | 同 int |
| String | double | Double.parseDouble(str) | 科學計數法支援 |
| String | float | Float.parseFloat(str) | 精度較低 |
| String | boolean | Boolean.parseBoolean(str) | 僅 "true"(忽略大小寫) 為 true |
| String | Date | LocalDate.parse(str, formatter) | Java 8+ 推薦 java.time |
int i = Integer.parseInt("123"); // 123
long l = Long.parseLong("12345678901"); // 12345678901
double d = Double.parseDouble("3.14159"); // 3.14159
boolean b = Boolean.parseBoolean("true"); // true
異常處理:統一捕獲 NumberFormatException,業務邏輯中建議封裝工具方法返回 Optional 或預設值。
String s1 = String.valueOf(123); // "123" (推薦,null 安全)
String s2 = Integer.toString(123); // "123"
String s3 = 123 + ""; // "123" (編譯器優化為 StringBuilder)
String s4 = String.valueOf(3.14); // "3.14"
// String → Integer
Integer boxed = Integer.valueOf("123"); // 緩存池優化
// Integer → String
String str = boxed.toString(); // "123"
// 通用模板
public static T parse(String s, Function parser) {
try { return parser.apply(s); }
catch (Exception e) { return null; }
}
// 用法:parse("123", Integer::valueOf)
Integer i = 100; // 裝箱:Integer.valueOf(100)
int primitive = i; // 拆箱:i.intValue()
// 陷阱:緩存池範圍 -128~127
Integer a = 127, b = 127; // a == b → true
Integer c = 128, d = 128; // c == d → false (需用 equals)
// String → LocalDate
LocalDate date = LocalDate.parse("2024-01-15"); // ISO 格式
LocalDate date2 = LocalDate.parse("2024/01/15",
DateTimeFormatter.ofPattern("yyyy/MM/dd"));
// LocalDate → String
String iso = date.toString(); // "2024-01-15"
String custom = date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
// 舊版 java.sql.Date 互轉
java.sql.Date sqlDate = java.sql.Date.valueOf("2024-01-15");
String sqlStr = sqlDate.toString();
// 任意進制 → 十進制
int dec = Integer.parseInt("FF", 16); // 255
int dec2 = Integer.parseInt("1111", 2); // 15
// 十進制 → 任意進制字串
String hex = Integer.toHexString(255); // "ff"
String bin = Integer.toBinaryString(15); // "1111"
String oct = Integer.toOctalString(63); // "77"
String custom = Integer.toString(255, 16); // "ff" (指定基數)
public final class ConvertUtils {
private ConvertUtils() {}
public static Integer toInteger(Object obj) {
if (obj == null) return null;
if (obj instanceof Integer) return (Integer) obj;
if (obj instanceof Number) return ((Number) obj).intValue();
if (obj instanceof String) {
String s = ((String) obj).trim();
if (s.isEmpty()) return null;
try { return Integer.parseInt(s); }
catch (NumberFormatException ignored) {}
}
return null;
}
// Long, Double, Boolean, LocalDate 同理...
public static String toString(Object obj) {
return obj == null ? null : String.valueOf(obj);
}
}
Optional.ofNullable()。float/double 財務計算禁用,改用 BigDecimal。Integer.valueOf() 緩存 -128~127,new Integer() 每次新建對象(已棄用)。String.format、toLowerCase 等受系統 Locale 影響,跨平台請顯式指定 Locale.ROOT。Date、SimpleDateFormat 非線程安全,全面遷移至 java.time。Java 類型轉換核心在於「基本類型 ↔ 包裝類 ↔ String」三角互轉。掌握 parseXxx、valueOf、toString、String.valueOf 四大核心方法,配合 Java 8 java.time 處理日期,並封裝通用工具類統一異常處理,即可應對 99% 業務場景。切記:拆箱防 NPE、金額用 BigDecimal、日期用 java.time。