最推荐的方法
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
String.valueOf(int) |
性能最好,代码清晰,可读性高 | 无明显缺点 | ⭐⭐⭐⭐⭐ (首选) |
Integer.toString(int) |
性能好,代码简洁 | 稍微比 valueOf 多一步创建对象的步骤(但JVM优化后差异极小) |
⭐⭐⭐⭐⭐ (首选) |
int + "" (字符串连接) |
书写最简单 | 性能最差,会创建不必要的 StringBuilder 对象,可读性稍差 |
⭐⭐ |
String.format() |
功能强大,可用于格式化输出 | 对于简单转换来说有点“杀鸡用牛刀”,性能稍差 | ⭐⭐⭐ |
使用 String.valueOf(int) (最推荐)
这是最常用和最安全的方法。String 类提供了一个静态的 valueOf() 方法重载,可以接受所有基本数据类型,并将其转换为字符串。

代码示例:
int number = 123; String str = String.valueOf(number); System.out.println(str); // 输出: 123 System.out.println(str.getClass().getName()); // 输出: java.lang.String // 也可以用于其他基本类型 double d = 123.45; String strFromDouble = String.valueOf(d); System.out.println(strFromDouble); // 输出: 123.45
优点:
- 性能高: 这是官方推荐的方法,JVM对其有优化,通常性能是最好的。
- 代码清晰:
String.valueOf(number)的意图非常明确,就是将一个值转换为字符串。 - 可读性好: 代码易于理解。
使用 Integer.toString(int) (非常推荐)
Integer 类是 int 的包装类,它提供了一个静态的 toString() 方法,可以直接将 int 转换为 String。
代码示例:

int number = 456; String str = Integer.toString(number); System.out.println(str); // 输出: 456 System.out.println(str.getClass().getName()); // 输出: java.lang.String
优点:
- 性能高: 与
String.valueOf()性能几乎一样好,在实际应用中差异可以忽略不计。 - 代码简洁:
Integer.toString(number)也很直观。
与 String.valueOf() 的细微差别:
String.valueOf(int i) 内部实际上是调用了 Integer.toString(i),所以从功能上看,它们是等价的,你可以根据个人或团队的编码风格任选其一。
使用空字符串连接 int + "" (不推荐,但常见)
这是一种非常简洁的“技巧”,通过将一个 int 与一个空字符串 进行连接,利用 Java 的自动类型转换机制,将 int 转换为 String。
代码示例:

int number = 789; String str = number + ""; System.out.println(str); // 输出: 789
缺点:
- 性能最差: 在底层,Java 编译器会将这种操作翻译成类似
new StringBuilder().append(number).toString()的代码,虽然现代 JVM 对这种简单情况做了优化,但在循环或复杂场景下,其性能明显不如前两种方法。 - 可读性差: 这种写法不够“专业”,可能会让其他开发者觉得你对 Java 的转换机制不够了解。
- 可能产生
NullPointerException: 虽然这里用 是安全的,但如果变量是可能为null的对象,obj + ""会抛出NullPointerException,而String.valueOf(obj)则会安全地输出"null"字符串。
使用 String.format() (适用于格式化)
String.format() 方法功能非常强大,它类似于 C 语言中的 printf,可以按照指定的格式来生成字符串,虽然它也能完成转换,但主要用于更复杂的格式化需求。
代码示例:
int number = 1010;
// 简单转换
String str = String.format("%d", number);
System.out.println(str); // 输出: 1010
// 格式化转换,例如补零
String formattedStr = String.format("%05d", number); // 格式化为5位,不足前面补0
System.out.println(formattedStr); // 输出: 01010
// 格式化为带千位分隔符的字符串
String localeFormattedStr = String.format("%,d", 1000000);
System.out.println(localeFormattedStr); // 输出: 1,000,000 (取决于系统默认Locale)
优点:
- 功能强大: 可以轻松实现补零、添加千位分隔符、控制小数位数等复杂格式化操作。
- 国际化支持: 可以方便地处理不同地区的数字格式。
缺点:
- 性能开销: 对于简单的转换,
String.format()的性能比前三种方法要差,因为它需要解析格式化字符串。 - “小题大做”: 如果只是为了一个简单的转换,使用
format()会显得代码冗余。
性能对比(简单示例)
下面是一个简单的性能测试代码,可以直观地看出不同方法的差异。
public class IntToStringPerformance {
public static void main(String[] args) {
int number = 12345;
int iterations = 100_000_000; // 一亿次循环
// --- 测试 String.valueOf() ---
long start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
String.valueOf(number);
}
long durationValueOf = System.nanoTime() - start;
// --- 测试 Integer.toString() ---
start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
Integer.toString(number);
}
long durationToString = System.nanoTime() - start;
// --- 测试 "" + int ---
start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
number + "";
}
long durationConcat = System.nanoTime() - start;
// --- 测试 String.format() ---
start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
String.format("%d", number);
}
long durationFormat = System.nanoTime() - start;
// 打印结果 (纳秒)
System.out.println("String.valueOf(): " + durationValueOf / 1_000_000 + " ms");
System.out.println("Integer.toString(): " + durationToString / 1_000_000 + " ms");
System.out.println("\"\" + int: " + durationConcat / 1_000_000 + " ms");
System.out.println("String.format(): " + durationFormat / 1_000_000 + " ms");
}
}
在我的机器上运行结果(可能因硬件和JVM版本而异):
String.valueOf(): 418 ms
Integer.toString(): 422 ms
"" + int: 751 ms
String.format(): 987 ms
从结果可以看出,String.valueOf() 和 Integer.toString() 性能最佳且非常接近,"" + int �了近一倍,而 String.format() 最慢。
结论与最佳实践
对于将 int 转换为 String 这个任务:
-
首选
String.valueOf(int)或Integer.toString(int),两者在性能和可读性上都非常出色,是专业开发者的标准选择,我个人更偏爱String.valueOf(),因为它是一个统一的方法,可以处理所有基本类型,代码风格更一致。 -
避免使用
int + "",虽然它简单快捷,但在性能和代码专业性上都有所欠缺,在性能敏感的代码或大型项目中,应尽量避免。 -
仅在需要格式化时使用
String.format(),如果你需要对数字进行补零、添加分隔符等特殊处理,String.format()是不二之选。
