Java 为什么String.valueOf在将整数转换为字符串时比字符串串联快?

Java 为什么String.valueOf在将整数转换为字符串时比字符串串联快?,java,string,benchmarking,string-concatenation,settext,Java,String,Benchmarking,String Concatenation,Settext,这是问题的反面。它不是复制品。相反,它源于基准测试断言t.setText(String.valueOf(number))比t.setText(“+number)快,以及ChristianB关于为什么会这样的问题。字符串添加导致编译器创建一个StringBuilder实例,然后为每个添加的元素追加调用,然后调用StringBuilder.toString(),以创建生成的串联String实例 因此,“+number创建一个StringBuilder,使用与String.valueOf相同的转换附加

这是问题的反面。它不是复制品。相反,它源于基准测试断言
t.setText(String.valueOf(number))
t.setText(“+number)
快,以及ChristianB关于为什么会这样的问题。

字符串添加导致编译器创建一个
StringBuilder
实例,然后为每个添加的元素追加调用,然后调用
StringBuilder.toString()
,以创建生成的串联
String
实例

因此,
“+number
创建一个
StringBuilder
,使用与
String.valueOf
相同的转换附加一个数字,然后使用
StringBuilder.toString
StringBuilder
创建一个
String
实例

String.valueOf(number)
避免使用StringBuilder,只使用
String.valueOf
中的值


如果编译器能够识别最终的字符串结果,因为附加的元素都是常量,那么当编译器能够避免所有这些时,答案可能不一样。在这种情况下,编译器只是将最后一个字符串放入编译后的代码中。

字符串添加导致编译器创建一个
StringBuilder
实例,然后为每个添加的元素追加调用,然后调用
StringBuilder.toString()
创建结果连接的
字符串
实例

因此,
“+number
创建一个
StringBuilder
,使用与
String.valueOf
相同的转换附加一个数字,然后使用
StringBuilder.toString
StringBuilder
创建一个
String
实例

String.valueOf(number)
避免使用StringBuilder,只使用
String.valueOf
中的值


如果编译器能够识别最终的字符串结果,因为附加的元素都是常量,那么当编译器能够避免所有这些时,答案可能不一样。在这种情况下,编译器只是将最后一个字符串放入编译后的代码中。

问题是“两个类似的基准测试如何可能在两个不同平台上运行的两个不同VM上显示相反的结果?”@这是因为我们的基准测试是不同的,在另一个问题中,可能还与setText与plain转换有关。但如果有其他原因,当然,让我们知道!甚至可以打赌,它有时更快,有时更慢,这取决于您使用的JDK版本。但在这种情况下,只需使用String.valueOf()或静态整数.toString()。问题是“两个类似的基准测试如何可能在两个不同平台上运行的两个不同虚拟机上显示相反的结果?”@另一方面,这是因为我们的基准测试是不同的,在另一个问题中,可能还与setText与plain转换有关。但如果有其他原因,当然,让我们知道!甚至可以打赌,它有时更快,有时更慢,这取决于您使用的JDK版本。但在这种情况下,只需使用String.valueOf()或static Integer.toString()。我不认为这对Java 9+是正确的,我错了吗?会有什么不同?我读过,但我从来没有深入研究过,所以我不想做出任何大胆的声明。看来现在有机会引入新的串联算法,但这一变化并没有说明新的方法是否已经在java版本中实现,或者它是否只是动态链接到同一个StringBuilder方法。据我所知,动态实现在大多数情况下仍然使用StringBuilder方法,所以这个答案基本上是准确的(只是不再是编译器生成的代码)我不认为这对Java 9+是正确的,我错了吗?会有什么不同?我读过,但我从来没有深入研究过,所以我不想提出任何大胆的主张。看来现在有机会引入新的串联算法,但这一变化并没有说明新的方法是否已经在java版本中实现,或者它是否只是动态链接到同一个StringBuilder方法。据我所知,动态实现在大多数情况下仍然使用StringBuilder方法,所以这个答案基本上是准确的(只是不再是编译器生成的代码)