所以我看过this question,它提供了几种将整数转换为字符串的方法,但我想知道它们之间是否有任何区别。
如果我想将整数i转换为字符串,那么这三种方式之间是否存在差异(并且比其他方式更快)?
i+""
Integer.toString(i)
String.valueOf(i)
我倾向于使用第二个或第三个,因为第一个对我来说似乎很奇怪。另一方面,如果我想将整数i转换为字符串,然后将其连接到另一个字符串s,我可以这样做:
i+s
Integer.toString(i)+s
String.valueOf(i)+s
在这里,我倾向于使用第一个,因为无论如何我都在连接。但我的问题是:这里应该使用哪些标准做法,以及这三种方法之间的差异(如果有的话)究竟是什么?
答案 0 :(得分:7)
选项1 ""+i
实际上被编译器解释为选项1b new StringBuilder("").append(i).toString()
。
第二个选项String.valueOf(i)
在内部调用Integer.toString(i)
,因此有一个方法调用的开销。
第三个选项Integer.toString(i)
似乎在我的基准测试中速度最快。
在我的测试中(aprx。平均多次运行):
我使用的简单基准代码:
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
。