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

时间:2014-07-24 17:40:40

标签: java string

所以我看过this question,它提供了几种将整数转换为字符串的方法,但我想知道它们之间是否有任何区别。

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

i+""
Integer.toString(i)
String.valueOf(i)

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

i+s
Integer.toString(i)+s
String.valueOf(i)+s

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

7 个答案:

答案 0 :(得分:7)

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

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

第三个选项Integer.toString(i)似乎在我的基准测试中速度最快。

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

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

我使用的简单基准代码:

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));

}

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

""+i在其他帖子中最快的结论可能是由于基准测试错误导致编译成常量。

答案 1 :(得分:2)

一项简单的测试揭示了它们之间的巨大差异。

允许在运行之间启动和冷却,然后对于每个测试,对于每个选项运行到Integer.MAX_VALUE,我得到了这些结果:

""+1 took 675 millis
String.valueOf(1) took 52244 millis
Integer.toString(1) took 53205 millis

结果:尽可能使用i+""""+1

在这里踢的社会责任感: 我的测试(如我所示)“”+ 1,String.valueOf(1)和Integer.toString(1)。当我重新运行测试时,我发现了相同的结果。但是,当我使用变量时,如ASantos和VSchäfer所示,解决方案之间的时间相似。

呼。我现在感觉好多了。

答案 2 :(得分:2)

好的答案。我已经尝试过了(只是为了好玩)并且有相似的时间。

""+i被解释为StringBuilder("").append(i).toString(),其中""+1被内联。

我怀疑这里介绍的一些基准是内联的。

根据我的测试,我发现了这些时间:

Option 1 (K) ""+8  :            655 milliseconds
Option 1 (var) ""+i:          83462 milliseconds
Option 2 String.valueOf(i):   90685 milliseconds
Option 3 Integer.toString(i): 88764 milliseconds

选项1(K)是我怀疑这里使用的一些测试。 选项2略好于选项4.可能是由于JVM中的一些优化?

我使用的是MacBook Pro,JVM是1.7.0_21

这是我使用的源代码:

public class Main{
    public static void main(String[] args) throws InterruptedException
    {
        // warm up the JVM
        for (int i = 0; i < 1000; i++)
        {
            String aString = ""+i;
        }

        long now = System.currentTimeMillis();
        for (int i = 0; i < Integer.MAX_VALUE; i++)
        {
            String aString = ""+8;
        }
        System.out.println("Option 1 (K) \"\"+8 "+(System.currentTimeMillis()-now));

        now = System.currentTimeMillis();
        for (int i = 0; i < Integer.MAX_VALUE; i++)
        {
            String aString = ""+i;
        }
        System.out.println("Option 1 (var) \"\"+i "+(System.currentTimeMillis()-now));

        Thread.sleep(1000); 
        now = System.currentTimeMillis();
        for (int i = 0; i < Integer.MAX_VALUE; i++)
        {
            String aString = String.valueOf(i);
        }
        System.out.println("Option 2 String.valueOf(i) "+(System.currentTimeMillis()-now));

        Thread.sleep(1000); 
        now = System.currentTimeMillis();
        for (int i = 0; i < Integer.MAX_VALUE; i++)
        {
            String aString = Integer.toString(i);
        }
        System.out.println("Option 3 Integer.toString(i) "+(System.currentTimeMillis()-now));

    }
}

答案 3 :(得分:1)

String.valueOf(i); 

实际上是打电话

Integer.toString(i);

如果您在空对象中调用toString(),还会得到一个NullPointerException

此外,String类的静态valueOf()采用不同的原始参数并提供更大的灵活性

答案 4 :(得分:1)

差异:

String to int

//overhead as you are appending a empty string with an int
""+i
//More generic (can be the same for float, double, long & int)
String.valueOf(i)
//Type Safe you know for sure that what you are converting is an Integer.
Integer.toString(i)

不,没有标准的方法取决于你想要完成什么,如果你希望你的代码更强大,你可以试试valueOf(),如果你想确定它实际上是Integer比第二个(不推荐第一个)。

这三者之间没有显着的性能差异。

另一种方式类似于String对int的注释。

答案 5 :(得分:1)

1 +&#34;&#34 ;;趋向于在计算上比其他两个更快,但就行业标准来说,它往往是不受欢迎的。我个人会使用String.valueOf(i),但我相信Integer.toString(i)也是可以接受的。我+&#34; S&#34;在连接的情况下也没问题。

答案 6 :(得分:1)

String.valueOf(int)的源代码是:

public static String valueOf(int i) {
    return Integer.toString(i);
}

由于String类是final,因此JIT可能会内联此调用。

如果是i + "",它会创建StringBuilder并调用其append(int)方法,最终会调用Integer.getChars,方法与{{1}相同1}}用于获取整数的字符串表示。它还会调用Integer.toString方法追加空字符串,然后调用append(String)来获取toString生成的String