杰瑞科技汇

Java int转字符串有哪些方法?

最推荐的方法

方法 优点 缺点 推荐度
String.valueOf(int i) 最直接、最清晰、性能最好,这是专门为基本类型设计的重载方法。 无明显缺点。 ⭐⭐⭐⭐⭐ (首选)
Integer.toString(int i) 性能也很好,语义明确,直接将整数转为字符串。 略微冗长,需要先获取 Integer 对象的引用。 ⭐⭐⭐⭐ (次选)
"" + int 书写最简单,直观。 性能最差,会创建不必要的 StringBuilder 对象,不推荐在性能敏感的代码中使用。 ⭐⭐ (不推荐)
String.format() 功能最强大,可以格式化数字(如补零、千位分隔符等)。 对于简单的转换,有点“杀鸡用牛刀”,代码稍显复杂。 ⭐⭐⭐ (适用于格式化)

详细介绍与代码示例

String.valueOf(int i) - 最推荐

这是最常用、最简洁、性能最高的方法。String 类提供了多个重载的 valueOf 方法,专门用于将各种基本数据类型(如 int, double, boolean 等)转换为字符串。

代码示例:

int number = 12345;
String str1 = String.valueOf(number);
System.out.println(str1); // 输出: 12345
System.out.println(str1.getClass().getName()); // 输出: java.lang.String

为什么推荐?

  • 清晰明了:代码意图非常清晰,就是要将一个值转换为字符串。
  • 性能优异:在底层,它直接调用 Integer.toString(i),避免了不必要的对象创建和类型检查,是编译器和 JVM 优化的首选。
  • 安全:可以正确处理 null 值(如果传入的是 Integer 对象),但对于 int 基本类型,不存在 null 的问题。

Integer.toString(int i) - 性能也很好

这个方法是 Integer 类的静态方法,它的功能就是将一个 int 值转换为 String 对象,它和 String.valueOf(int i) 在性能上几乎可以认为是相同的。

代码示例:

int number = 67890;
String str2 = Integer.toString(number);
System.out.println(str2); // 输出: 67890

String.valueOf 的细微差别:

  • String.valueOf(int i) 内部就是调用的 Integer.toString(i)
  • 从代码风格上讲,String.valueOf() 更通用,可以接受任何基本类型,而 Integer.toString() 更明确地表示你在处理一个整数,两者都是非常优秀的选择。

使用空字符串连接 ("" + int) - 不推荐

这是一种非常“取巧”的方法,通过将一个整数与一个空字符串进行连接,利用 Java 的自动类型转换机制,隐式地将 int 转换为 String

代码示例:

int number = 100;
String str3 = "" + number;
System.out.println(str3); // 输出: 100

为什么不推荐?

  • 性能差:这是最大的缺点,当 运算符用于连接字符串时,Java 编译器会将其优化为使用 StringBuilder,即使是 "" + number,JVM 也会创建一个临时的 StringBuilder 对象,执行 append() 操作,最后再调用 toString(),这个过程比直接调用 String.valueOf()Integer.toString() 要慢,并且会产生额外的对象垃圾,给垃圾回收带来压力。
  • 可读性稍差:虽然看起来简单,但对于不熟悉 Java 隐式转换规则的开发者来说,String.valueOf() 的意图更明确。

注意: 这种方法在 C++ 或 JavaScript 中可能更常见,但在 Java 中应尽量避免。


String.format() - 适用于格式化

String.format() 方法非常强大,它使用 printf 风格的格式化说明符来创建字符串,如果你不仅需要转换,还需要对数字进行格式化(补零、添加千位分隔符、限制小数位数等),String.format() 是不二之选。

代码示例:

int number = 99;
// 简单转换(不推荐,小题大做)
String str4 = String.format("%d", number);
System.out.println(str4); // 输出: 99
// 格式化:补零,总宽度为5
String str5 = String.format("%05d", number);
System.out.println(str5); // 输出: 00099
// 格式化:添加千位分隔符
int bigNumber = 1234567;
String str6 = String.format("%,d", bigNumber);
System.out.println(str6); // 输出: 1,234,567

优点:

  • 功能强大,可以处理复杂的格式化需求。
  • 代码可读性高,格式化规则一目了然。

缺点:

  • 对于简单的类型转换,显得过于笨重,性能也比前几种方法略低。

性能对比(简单测试)

下面的代码可以大致比较这几种方法的性能差异(微基准测试非常复杂,这只是一个简单的演示)。

public class IntToStringPerformance {
    public static void main(String[] args) {
        int iterations = 100_000_000;
        int number = 123456;
        // --- String.valueOf() ---
        long start1 = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            String.valueOf(number);
        }
        long duration1 = System.nanoTime() - start1;
        // --- Integer.toString() ---
        long start2 = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            Integer.toString(number);
        }
        long duration2 = System.nanoTime() - start2;
        // --- "" + int ---
        long start3 = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            "" + number;
        }
        long duration3 = System.nanoTime() - start3;
        System.out.println("String.valueOf: " + duration1 / 1_000_000 + " ms");
        System.out.println("Integer.toString: " + duration2 / 1_000_000 + " ms");
        System.out.println("\"\" + int: " + duration3 / 1_000_000 + " ms");
    }
}

在我的机器上运行结果(仅供参考):

String.valueOf: 124 ms
Integer.toString: 124 ms
"" + int: 342 ms

String.valueOf()Integer.toString() 性能几乎持平,远优于 "" + int 的方式。

最终建议

  • 日常开发、简单转换:请毫不犹豫地使用 String.valueOf(int i),它是最佳实践,兼顾了性能、可读性和简洁性。
  • 需要明确处理整数逻辑时:使用 Integer.toString(int i) 也是一个非常好的选择。
  • 需要数字格式化时:使用 String.format(),它能满足你所有复杂的格式化需求。
  • 避免使用"" + int 的方式,除非是在一些极其不重要的代码片段中追求极致的简洁性,并且不关心性能。
分享:
扫描分享到社交APP
上一篇
下一篇