TL;DR)
| 方法 | 代码示例 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|
String.valueOf() |
String str = String.valueOf(123); |
性能最好,代码清晰,null 安全 |
无明显缺点 | ⭐⭐⭐⭐⭐ (最推荐) |
Integer.toString() |
String str = Integer.toString(123); |
性能也很好,代码清晰 | 对于基本类型 int,valueOf 是原生方法,可能更快一点点 |
⭐⭐⭐⭐⭐ (强烈推荐) |
| 字符串拼接 | String str = "" + 123; |
简单直观 | 性能最差,会创建不必要的 StringBuilder 对象 |
⭐⭐ |
String.format() |
String str = String.format("%d", 123); |
功能强大,适合格式化输出 | 有点“杀鸡用牛刀”,性能不如前两者 | ⭐⭐⭐ |
new Integer().toString() |
String str = new Integer(123).toString(); |
早期 Java 常用 | 会创建不必要的 Integer 对象,不推荐 |
⭐ |
String.valueOf(int i) - 最推荐
这是最常用、性能也最好的方法。String 类提供了一个重载的 valueOf 方法,专门用于将基本数据类型(如 int, double, boolean 等)转换为字符串。

代码示例:
int number = 100; String str1 = String.valueOf(number); System.out.println(str1); // 输出: 100 System.out.println(str1.getClass().getName()); // 输出: java.lang.String
优点:
- 性能高:
valueOf(int)是一个本地方法(native method),由 JVM 直接优化,执行效率非常高。 - 代码清晰:意图明确,一眼就能看出是要将一个值转换为字符串。
null安全:如果传入的是一个包装类型Integer的null值,String.valueOf(null)会输出字符串"null",而不会抛出NullPointerException,虽然对于基本类型intnull不适用,但这个方法的一致性很好。
Integer.toString(int i) - 强烈推荐
这是另一种非常高效和推荐的方法。Integer 类是 int 的包装类,它提供了静态的 toString() 方法来完成转换。
代码示例:

int number = 200; String str2 = Integer.toString(number); System.out.println(str2); // 输出: 200 System.out.println(str2.getClass().getName()); // 输出: java.lang.String
优点:
- 性能高:与
String.valueOf()性能几乎一样好,也是非常高效的选择。 - 代码清晰:同样表达了明确的转换意图。
与 String.valueOf() 的细微差别:
String.valueOf(int i)内部就是调用了Integer.toString(i),所以从功能上看,它们几乎完全等价。- 在一些极端性能测试中,
String.valueOf()可能会因为有 JVM 优化而略微快一点点,但这种差异在实际应用中完全可以忽略不计。 - 选择建议:两者都是顶级选择,可以任选一个,遵循项目或团队的编码风格即可。
使用 字符串拼接 - 简单但低效
这是最直观、最“傻瓜式”的方法,通过将一个空字符串 与 int 变量相连接,利用 Java 的自动类型转换机制来完成。
代码示例:

int number = 300; String str3 = "" + number; System.out.println(str3); // 输出: 300
原理:
当 运算符的一边是字符串,另一边是基本类型时,JVM 会自动将基本类型通过 String.valueOf() 转换为字符串,然后再进行拼接。
缺点:
- 性能差:在编译后,
"" + number实际上会被编译器优化为new StringBuilder().append("").append(number).toString(),如果是在循环中进行拼接,会反复创建StringBuilder对象,导致性能急剧下降。 - 可读性稍差:虽然简单,但在复杂的表达式中, 运算符的意图不如
String.valueOf()或Integer.toString()那么清晰。
适用场景:仅在需要快速转换单个变量,且对性能要求不高的简单脚本或调试代码中使用。
String.format() - 功能强大,用于格式化
String.format() 方法功能非常强大,它使用格式化字符串来生成新的字符串,虽然可以用来做类型转换,但它主要用于更复杂的格式化需求。
代码示例:
int number = 123;
String str4 = String.format("%d", number);
System.out.println(str4); // 输出: 123
优点:
- 功能强大:不仅可以转换,还可以指定格式,例如补零、千位分隔符等。
int num = 99; // 补零,总宽度为5 String formattedStr = String.format("%05d", num); System.out.println(formattedStr); // 输出: 00099
缺点:
- 性能开销:
String.format()比前几种方法要慢,因为它需要解析格式化字符串,并创建Formatter对象。 - “杀鸡用牛刀”:如果仅仅是做简单的类型转换,使用
format显得有些小题大做。
适用场景:当你需要对输出结果进行特定格式化时,这才是它的用武之地。
new Integer(i).toString() - 过时且不推荐
在早期版本的 Java 中,这是一种常见的方法,它首先创建一个 Integer 对象,然后调用该对象的 toString() 方法。
代码示例:
int number = 400; // 不推荐! String str5 = new Integer(number).toString(); System.out.println(str5); // 输出: 400
缺点:
- 性能差:它会创建一个不必要的
Integer对象,这个过程涉及到内存分配和垃圾回收,会带来性能开销,对于基本类型int,这完全是多余的。 - 代码冗余:有更简单、更高效的方法。
适用场景:几乎不适用,这种写法在现代 Java 编程中已经过时,应避免使用。
性能对比(简单示例)
为了直观感受性能差异,这里有一个简单的 JMH (Java Microbenchmark Harness) 测试思路(非精确测试,仅作示意):
// 假设在一个循环中执行百万次
long start = System.nanoTime();
for (int i = 0; i < 1_000_000; i++) {
String.valueOf(i); // 或其他方法
}
long end = System.nanoTime();
System.out.println("String.valueOf(): " + (end - start) + " ns");
预期结果(大致排序,从快到慢):
String.valueOf(int)Integer.toString(int)String.format("%d", int)"" + int(在循环中表现极差)new Integer(int).toString()
结论与最佳实践
| 场景 | 推荐方法 |
|---|---|
| 通用、高性能转换 | String.valueOf(int) 或 Integer.toString(int) (二选一即可) |
| 在循环中进行拼接 | 始终使用 StringBuilder 或 StringBuffer。 |
| 需要特定格式(如补零) | String.format() |
| 快速调试或简单脚本 | "" + int (可以接受,但不推荐在生产代码中使用) |
| 避免 | new Integer(int).toString() |
在你的日常 Java 开发中,请优先选择 String.valueOf() 或 Integer.toString() 来将 int 转换为 String,它们是最高效、最专业、最被社区认可的做法。
