Integer.toString()和String.valueOf()之间的性能差异?

4

我可以定义一个整数,比如说:int a = 123;

现在,我可以使用以下两种方法将它转换为字符串:

1. Integer.toString(a)
2. String.valueOf(a)

我想知道,在对1万个或更多整数执行此操作时,上述两种方法之间是否存在性能差异,如果有,为什么?


1
使用JMH进行测试。 - Johannes Kuhn
1
这个回答解决了你的问题吗?Integer.toString(int i) vs String.valueOf(int i) - Locke
3个回答

5

String.valueOf(int)内部调用了Integer.toString(int)。因此,它们之间不会有任何性能差异。理论上,Integer.toString()应该更好,因为少了一次调用。


2
以下是JDK 8中两种方法的源代码:
这是Intger.toString()的源代码。
 public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}

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

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

如您所见,性能上几乎没有任何差别,因为在两种情况下都调用了 Integer.toString()
但如果您必须选择一种方法,答案是 Integer.toString()。因为这样可以减少调用 String.valueOf(int) 的开销,虽然这个削减的量非常小,但是您可能知道,方法调用涉及许多事情,例如将方法调用放在堆栈上、保存状态和控制返回位置、弹出它等,所有这些步骤都将被避免,但计算机运行速度太快,所以不会有什么影响。

1

性能应该几乎相同,因为String.valueOf(a)的定义如下:

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

很明显,Integer.toString更快,因为它可以跳过调用堆栈上的String.valueOf,但我不知道实际差异是否足够明显。

不幸的是,Java通常不会内联函数调用,因此至少需要额外花费时间加载函数,但在第一次调用后,CPU缓存可能会使重定向几乎不可见。

编辑:您可以通过在IDE中使用“转到定义”来自行查找。我能够通过选择函数调用并在Intellij Idea中按Ctrl + B来获取此代码片段。


1
Java虚拟机通常执行某种形式的JIT,可以像这样内联方法。 - Mark Rotteveel
Java通常不会内联函数调用:false。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接