最推荐的方法
| 方法 | 代码示例 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
String.valueOf() |
String s = String.valueOf(123); |
性能最好,代码清晰,可读性高 | 无明显缺点 | 绝大多数情况下的首选 |
Integer.toString() |
String s = Integer.toString(123); |
性能也很好,是 valueOf 的核心实现 |
稍微冗长一点点 | 与 Integer 类操作相关时 |
| 拼接 | String s = 123 + ""; |
简单、直观 | 性能最差,会创建不必要的 StringBuilder 对象 |
简单、临时的场景,不推荐在性能关键代码中使用 |
String.format() |
String s = String.format("%d", 123); |
功能强大,可轻松格式化数字 | 语法稍复杂,性能不如前两者 | 需要对数字进行格式化(如补零、千位分隔符等)时 |
String.valueOf(int i) - 最推荐
这是最常用、性能最好的方法,它是一个静态方法,可以直接将基本数据类型 int 转换为 String。

工作原理:
String.valueOf(int) 方法内部会调用 Integer.toString(i),但它提供了更统一、更安全的接口,当你不确定传入参数的类型时(可能是 int, long, double, Object 等),使用 String.valueOf() 是最稳妥的选择。
代码示例:
int number = 100; String str1 = String.valueOf(number); System.out.println(str1); // 输出: 100 System.out.println(str1.getClass().getName()); // 输出: java.lang.String // 也可以用于负数 int negativeNumber = -50; String str2 = String.valueOf(negativeNumber); System.out.println(str2); // 输出: -50
Integer.toString(int i) - 性能次优
这个方法是 java.lang.Integer 类中的一个静态方法,它的功能与 String.valueOf(int) 几乎完全相同,也是将 int 转换为 String 的标准方式。
工作原理:
它是实际执行转换的核心逻辑,如果你确定你的对象一定是 Integer 类型,并且需要调用其方法,这个方法也很合适。

代码示例:
int number = 200; String str3 = Integer.toString(number); System.out.println(str3); // 输出: 200
valueOf vs toString 的选择:
String.valueOf(int):更通用,是String类的“官方”转换入口,推荐优先使用。Integer.toString(int):同样高效,如果你在处理Integer对象,或者代码风格倾向于直接使用包装类的方法,这也是一个很好的选择。
使用空字符串 拼接 - 不推荐(性能差)
这是一种非常直观的写法,通过将 int 与一个空字符串 进行拼接,Java 会自动将 int 转换为 String。
工作原理(重要!):
在 Java 5 之前,这种方式会创建一个临时的 StringBuffer 对象来执行拼接,从 Java 5 开始,JVM 对其进行了优化,会使用 StringBuilder,即使如此,它仍然比直接调用 String.valueOf() 或 Integer.toString() 慢,因为它涉及到创建一个额外的 StringBuilder 实例和调用其 append() 方法。

代码示例:
int number = 300; String str4 = number + ""; System.out.println(str4); // 输出: 300
为什么不推荐?
虽然代码看起来很短,但在循环或性能敏感的代码中,成千上万次地创建不必要的 StringBuilder 对象会累积成显著的性能开销。
String.format(String format, Object... args) - 用于格式化
这个方法功能非常强大,它不仅可以转换类型,还可以对结果进行格式化,当你需要控制数字的输出格式时(补零、添加千位分隔符、指定小数位数等),这是最佳选择。
工作原理:
它使用类似于 C 语言 printf 的格式化字符串。%d 是 int 类型的格式说明符。
代码示例:
int number = 123;
String str5 = String.format("%d", number);
System.out.println(str5); // 输出: 123
// --- 格式化示例 ---
// 1. 补零,总宽度为5
String str6 = String.format("%05d", number);
System.out.println(str6); // 输出: 00123
// 2. 添加千位分隔符
int largeNumber = 1234567;
String str7 = String.format("%,d", largeNumber);
System.out.println(str7); // 输出: 1,234,567
性能对比
下面是一个简单的 JMH (Java Microbenchmark Harness) 测试,可以直观地看出它们的性能差异。
import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class IntToStringBenchmark {
private int number = 12345;
@Benchmark
public String valueOf() {
return String.valueOf(number);
}
@Benchmark
public String toString() {
return Integer.toString(number);
}
@Benchmark
public String stringConcat() {
return number + "";
}
@Benchmark
public String stringFormat() {
return String.format("%d", number);
}
}
典型的性能结果(从快到慢):
String.valueOf(int)- 最快Integer.toString(int)- 极快,与valueOf几乎没有差别String.format("%d", ...)- 慢很多,因为它需要解析格式化字符串int + ""- 最慢,尽管有优化,但仍比前两者慢
结论与最佳实践
- 日常开发、追求性能:请毫不犹豫地选择
String.valueOf(int),它在所有情况下都是最优或接近最优的选择,并且代码清晰易读。 - 需要格式化数字:请使用
String.format(),它的强大功能远超简单的类型转换。 - 避免使用:尽量避免使用
int + ""的方式,尤其是在循环或性能关键路径中,虽然它看起来简单,但它是一种“伪简洁”,背后隐藏着性能成本。 - 不要使用
Integer.toString(new Integer(i)):这种写法是多余的。Integer.toString(int i)是静态方法,可以直接接收int基本类型,无需先创建Integer对象。
