将整数转换为Java中的字符串的最佳方法

Car*_*ter 1 java string

所以我看到了这个问题,它提供了几种将整数转换为字符串的方法,但我想知道它们之间是否有任何区别.

如果我想将整数i转换为字符串,那么这三种方式之间是否存在差异(并且比其他方式更快)?

i+""
Integer.toString(i)
String.valueOf(i)
Run Code Online (Sandbox Code Playgroud)

我会倾向于使用第二个或第三个,因为第一个对我来说似乎很奇怪.另一方面,如果我想将整数i转换为字符串然后将其连接到另一个字符串s,我可以这样做:

i+s
Integer.toString(i)+s
String.valueOf(i)+s
Run Code Online (Sandbox Code Playgroud)

在这里,我倾向于使用第一个,因为无论如何我都在连接.但我的问题是:这里应该使用哪些标准做法,以及这三种方法之间的差异(如果有的话)究竟是什么?

Vla*_*fer 7

选项1 ""+i实际上由编译器解释为选项1b new StringBuilder("").append(i).toString().

第二个选项在String.valueOf(i)内部调用Integer.toString(i),因此有一个方法调用的开销.

Integer.toString(i)在我的基准测试中,第三种选择似乎是最快的.

在我的测试中(aprx.平均多次运行):

  • 选项1:~64000毫秒
  • 选项1b:~64000 ms(与选项1相同,由于等效编译)
  • 选项2:~86000 ms(由于额外的方法调用)
  • 选项3:~40000毫秒

我使用的简单基准代码:

public static void main(String[] args) {

    int i = 0;
    String result;
    long time;

    time = System.currentTimeMillis();
    while (i < Integer.MAX_VALUE) {
        result = ""+i;
        i++;
    }
    System.out.println("Option 1: " + (System.currentTimeMillis() - time));

    i = 0;
    time = System.currentTimeMillis();
    while (i < Integer.MAX_VALUE) {
        result = new StringBuilder("").append(i).toString();
        i++;
    }
    System.out.println("Option 1b: " + (System.currentTimeMillis() - time));

    i = 0;
    time = System.currentTimeMillis();
    while (i < Integer.MAX_VALUE) {
        result = String.valueOf(i);
        i++;
    }
    System.out.println("Option 2: " + (System.currentTimeMillis() - time));

    i = 0;
    time = System.currentTimeMillis();
    while (i < Integer.MAX_VALUE) {
        result = Integer.toString(1);
        i++;
    }
    System.out.println("Option 3: " + (System.currentTimeMillis() - time));

}
Run Code Online (Sandbox Code Playgroud)

作为结论,至少在我的JVM(JDK 1.7.0_60 64位)上,选项3:Integer.toString(i)是最快的,我建议使用它.

""+i其中一篇文章中最快的结论可能是由于有缺陷的基准测试导致编译成常量.