杰瑞科技汇

Java int 转 string 有几种方法?

最推荐的方法

方法 优点 缺点 推荐度
String.valueOf(int) 性能最好,代码清晰,可读性高 无明显缺点 ⭐⭐⭐⭐⭐ (首选)
Integer.toString(int) 性能好,代码简洁 稍微比 valueOf 多一步创建对象的步骤(但JVM优化后差异极小) ⭐⭐⭐⭐⭐ (首选)
int + "" (字符串连接) 书写最简单 性能最差,会创建不必要的 StringBuilder 对象,可读性稍差 ⭐⭐
String.format() 功能强大,可用于格式化输出 对于简单转换来说有点“杀鸡用牛刀”,性能稍差 ⭐⭐⭐

使用 String.valueOf(int) (最推荐)

这是最常用和最安全的方法。String 类提供了一个静态的 valueOf() 方法重载,可以接受所有基本数据类型,并将其转换为字符串。

Java int 转 string 有几种方法?-图1
(图片来源网络,侵删)

代码示例:

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

代码示例:

Java int 转 string 有几种方法?-图2
(图片来源网络,侵删)
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

代码示例:

Java int 转 string 有几种方法?-图3
(图片来源网络,侵删)
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 这个任务:

  1. 首选 String.valueOf(int)Integer.toString(int),两者在性能和可读性上都非常出色,是专业开发者的标准选择,我个人更偏爱 String.valueOf(),因为它是一个统一的方法,可以处理所有基本类型,代码风格更一致。

  2. 避免使用 int + "",虽然它简单快捷,但在性能和代码专业性上都有所欠缺,在性能敏感的代码或大型项目中,应尽量避免。

  3. 仅在需要格式化时使用 String.format(),如果你需要对数字进行补零、添加分隔符等特殊处理,String.format() 是不二之选。

分享:
扫描分享到社交APP
上一篇
下一篇