首先,Integer.toString(i)
总是比""+i
不成立的假设更快。
最值得注意的是,ifi
是一个编译时间常数,""+i
与String.valueOf(i)
. 当然,如果定义像final int i=16;
,读者会反对使用""+i
,"16"
这样会更清楚。但是,如果我们谈论final int DEFAULT_USER = DEFAULT_GROUP << GROUP_BIT;
,""+DEFAULT_USER
比包含实际数字的文字字符串要清晰得多。作为一个编译时常量不仅仅是一个性能问题,它允许在语句的注释或case
标签中使用字符串。switch
如果i
不是编译时常量,则没有强制编译形式,所以原则上允许编译器编译""+i
到Integer.toString(i)
反正。如果我们将通常的幼稚(或者我们称之为“直截了当”)实现new StringBuilder().append("").append(i).toString()
与Integer.toString(i)
变体或假设的优化 Java 9 实现进行比较,只有从StringBuilder
' 的缓冲区到结果String
的值数组的最终复制操作可能有性能影响,但这可以通过 HotSpot JVM 优化掉。Java 9 解决方案针对的另一个问题,即 的StringBuilder
初始容量,与此处无关,因为int
的字符串表示很容易适合16
char
s 的默认容量。
对于大多数非平凡int
值,转换为十进制形式的成本将大大超过其他成本,因此如果您更喜欢""+i
,Integer.toString(i)
您不应该让性能问题成为不使用它的理由。这也意味着您不应该期望 Java 9 实现的显着加速。主要操作还是一样的。
我认为,Java 9 解决方案的最大改进是代码大小的减少,因为为每个字符串连接表达式生成的所有这些类似的调用序列将折叠为一条指令(这与多个表达式的连接特别相关)。提高性能的机会,只是一个不错的附加组件,但我不认为改进会是戏剧性的,尤其是在 JRE 9 的第一个版本中。
所以""+i
and Integer.toString(i)
or之间的决定String.valueOf(i)
只是一个风格问题(我们在这里不讨论),而不是性能问题。