Java String 與 int 相互轉換完全指南:核心 API、性能對比與避坑實戰
String ↔ int 轉換是 Java 開發中最高頻的基礎操作之一,看似簡單,實則暗藏 NumberFormatException、自動拆箱裝箱開銷、緩存機制差異等細節。本文系統梳理 4 種核心轉換方式、性能基準、異常處理模式與最佳實踐。
一、 int → String 四大核心方法
| 方法 | 簽名 | 特點 | 適用場景 |
String.valueOf() | static String valueOf(int i) | 官方推薦,null 安全,底層調用 Integer.toString() | 通用首選 |
Integer.toString() | static String toString(int i) | 直接調用,無額外開銷,性能最優 | 高頻熱點路徑 |
String.format() | static String format(String fmt, Object... args) | 支持格式化(補零、進制、千分位),內部創建 Formatter,較慢 | 需格式化輸出 |
"" + int | 字符串拼接 | 編譯器優化為 StringBuilder.append(),可讀性一般 | 簡單拼接場景 |
代碼示例
int num = 42;
String s1 = String.valueOf(num); // "42" ✓ 推薦
String s2 = Integer.toString(num); // "42" ✓ 最快
String s3 = String.format("%05d", num); // "00042" ✓ 格式化
String s4 = num + ""; // "42" △ 簡單場合可用
String s5 = String.format("%,d", 1234567); // "1,234,567" 千分位
二、 String → int 兩大核心方法
| 方法 | 簽名 | 返回類型 | 異常 | 適用場景 |
Integer.parseInt() | static int parseInt(String s) | 基本類型 int | NumberFormatException | 首選,無自動裝箱 |
Integer.valueOf() | static Integer valueOf(String s) | 包裝類型 Integer | NumberFormatException | 需 Integer 對象(如放入集合) |
進制轉換(雙參數重載)
Integer.parseInt("1010", 2); // 10 (二進制)
Integer.parseInt("FF", 16); // 255 (十六進制)
Integer.parseInt("77", 8); // 63 (八進制)
Integer.valueOf("2A", 16); // 42 (返回 Integer)
三、 性能基準測試(JMH 參考數據)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class IntStringConversionBenchmark {
@Benchmark public void intToString_valueOf() { String.valueOf(12345); }
@Benchmark public void intToString_toString() { Integer.toString(12345); }
@Benchmark public void intToString_format() { String.format("%d", 12345); }
@Benchmark public void intToString_concat() { 12345 + ""; }
@Benchmark public void stringToInt_parseInt() { Integer.parseInt("12345"); }
@Benchmark public void stringToInt_valueOf() { Integer.valueOf("12345"); }
}
/*
典型結果 (ns/op, 越小越快):
intToString_toString 12.3 ± 0.2 ← 最快
intToString_valueOf 12.5 ± 0.3 ← 幾乎相同
intToString_concat 18.7 ± 0.5 ← StringBuilder 開銷
intToString_format 850.0 ± 20.0 ← Formatter 極慢 (≈70x)
stringToInt_parseInt 45.2 ± 1.0 ← 首選
stringToInt_valueOf 48.5 ± 1.2 ← 額外裝箱開銷
*/
四、 異常處理最佳實踐
1. 防御性編程:預檢正則
private static final Pattern INT_PATTERN = Pattern.compile("^-?\\d+$");
public static int safeParseInt(String s, int defaultValue) {
if (s == null || !INT_PATTERN.matcher(s).matches()) {
return defaultValue;
}
try {
return Integer.parseInt(s);
} catch (NumberFormatException e) { // 雙重保險
return defaultValue;
}
}
2. Java 8+ Optional 風格
五、 自動裝箱/拆箱陷阱
、"123\u200B" → NFE,**先 trim()**
超出 int 範圍:"2147483648" → NFE,大數用 Long.parseLong 或 BigInteger
高頻熱點用 String.format → 性能殺手,改用 Integer.toString + 手動格式化
集合存儲用 Integer.valueOf → 利用緩存池減少對象創建
拼接字符串用 + 循環 → 隱式創建 StringBuilder,改用 StringBuilder 顯式構建
七、 進制轉換速查表
| 目標 | 代碼 | 結果 |
| int → 二進制字符串 | Integer.toBinaryString(42) | "101010" |
| int → 八進制字符串 | Integer.toOctalString(42) | "52" |
| int → 十六進制字符串 | Integer.toHexString(42) | "2a" |
| 字符串 → int (指定進制) | Integer.parseInt("2a", 16) | 42 |
| int → 任意進制 (2-36) | Integer.toString(42, 16) | "2a" |
掌握 String.valueOf/Integer.toString 雙雄與 Integer.parseInt 正統,配合正則預檢、Optional 異常處理、基本類型優先原則,讓 String↔int 轉換在正確性、性能、可讀性三維達到最優。