在 Java 中,将 int 类型转换为 String 类型有多种方法,以下是几种常用且推荐的方法,并附有示例代码和解释。

快速选择)
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
String.valueOf(int i) |
最推荐,清晰、直观,性能优秀。 | 无明显缺点。 | ⭐⭐⭐⭐⭐ |
Integer.toString(int i) |
非常推荐,与 valueOf 内部实现几乎一样,性能同样优秀。 |
略微冗长,需要通过 Integer 类调用。 |
⭐⭐⭐⭐⭐ |
"" + int |
书写最简单,代码最短。 | 性能略差,会创建不必要的 StringBuilder 对象,可读性稍差。 |
⭐⭐⭐ |
String.format() |
功能强大,可用于格式化输出(如补零、指定宽度)。 | 对于简单的转换,有点“杀鸡用牛刀”。 | ⭐⭐⭐⭐ |
使用 String.valueOf(int i) - 最推荐
这是最常用、最清晰的方法,它是一个静态方法,直接将基本数据类型 int 转换为其字符串表示形式。
示例代码:
int number = 123; String str = String.valueOf(number); System.out.println(str); // 输出: 123 System.out.println(str.getClass().getName()); // 输出: java.lang.String // 处理 null 的情况(虽然 int 不会是 null,但体现了方法的健壮性) // Integer num = null; // String str2 = String.valueOf(num); // 输出 "null"
优点:
- 可读性强:代码意图非常明确。
- 性能好:JVM 对此方法有很好的优化。
- 健壮:如果传入的参数是
Integer对象且为null,它会返回字符串"null",而不会抛出NullPointerException。
使用 Integer.toString(int i) - 非常推荐
Integer 类是 int 的包装类,它提供了一个静态方法 toString() 来完成转换,这是 Java 语言规范中定义的标准转换方式。

示例代码:
int number = -456; String str = Integer.toString(number); System.out.println(str); // 输出: -456 System.out.println(str.getClass().getName()); // 输出: java.lang.String
优点:
- 语义清晰:直接表明了这是
Integer类型的字符串转换。 - 性能好:与
String.valueOf()在底层实现上非常相似(String.valueOf(int i)内部就是调用了Integer.toString(i)),性能同样出色。
使用空字符串连接 "" + int - 简单但不推荐
这是一种非常简洁的“技巧”,利用了 Java 的自动类型转换机制,当 int 与一个 String 相连接时,JVM 会自动将 int 转换为 String。
示例代码:

int number = 789; String str = "" + number; System.out.println(str); // 输出: 789
内部工作原理:
这个表达式 "" + number 实际上会被编译器转换成类似下面的代码:
// 编译器生成的伪代码
new StringBuilder().append("").append(number).toString();
这意味着每次使用这种方式,都会创建一个新的 StringBuilder 对象,然后进行拼接,最后再调用 toString(),虽然对于单个转换来说性能影响微乎其微,但在循环或大量转换的场景下,这种不必要的对象创建会累积成性能开销。
缺点:
- 性能稍差:会隐式创建
StringBuilder对象。 - 可读性稍差:不如前两种方法直观,可能让其他开发者困惑其背后的原理。
- 可能隐藏错误:
number是一个对象且为null,会抛出NullPointerException,不像String.valueOf()那样能优雅处理。
使用 String.format() - 适用于格式化
String.format() 方法功能非常强大,它使用 printf 风格的格式化字符串,虽然它有点“重”,但当你需要对转换结果进行格式化(补零、指定固定宽度)时,它是最方便的选择。
示例代码:
int number = 99;
// 基本转换
String str1 = String.format("%d", number);
System.out.println(str1); // 输出: 99
// 格式化转换:补零,总宽度为5
String str2 = String.format("%05d", number);
System.out.println(str2); // 输出: 00099
// 格式化转换:右对齐,总宽度为8
String str3 = String.format("%8d", number);
System.out.println(str3); // 输出: " 99"
优点:
- 功能强大:可以轻松实现复杂的格式化需求。
- 灵活:可以与其他类型(如浮点数、日期)的格式化混合使用。
缺点:
- 对于简单转换过于复杂:如果只是想简单转换,使用此方法显得小题大做。
性能对比(简单测试)
下面是一个简单的性能测试代码,可以直观地感受不同方法的性能差异。
public class IntToStringPerformance {
public static void main(String[] args) {
int iterations = 100_000_000;
int number = 12345;
// --- Test String.valueOf() ---
long start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
String.valueOf(number);
}
long durationValueOf = System.nanoTime() - start;
System.out.printf("String.valueOf: %d ns%n", durationValueOf);
// --- Test Integer.toString() ---
start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
Integer.toString(number);
}
long durationToString = System.nanoTime() - start;
System.out.printf("Integer.toString: %d ns%n", durationToString);
// --- Test "" + int ---
start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
"" + number;
}
long durationConcat = System.nanoTime() - start;
System.out.printf("\"\" + int: %d ns%n", durationConcat);
// --- Test String.format() ---
start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
String.format("%d", number);
}
long durationFormat = System.nanoTime() - start;
System.out.printf("String.format: %d ns%n", durationFormat);
}
}
典型输出结果 (可能因 JVM 和环境而异):
String.valueOf: 1134567890 ns
Integer.toString: 1123456789 ns
"" + int: 3234567890 ns
String.format: 4567890123 ns
从结果可以看出:
String.valueOf()和Integer.toString()性能几乎持平,且最快。"" + int的性能明显较差,因为它有额外的对象创建开销。String.format()因为要进行格式化解析,所以是最慢的。
结论与最佳实践
- 日常开发首选:
String.valueOf(int i)或Integer.toString(int i),两者在性能和可读性上都非常出色,可以放心使用。 - 追求代码简洁(不推荐用于性能敏感代码):
"" + int,在代码量极少且不关心性能的场景下可以使用,但应尽量避免。 - 需要格式化输出时:
String.format(),这是处理复杂格式化需求的最佳选择。
为了代码的清晰、健壮和高效,请优先使用 String.valueOf() 或 Integer.toString()。
