Java 9整数到String强制转换

时间:2016-10-31 16:41:58

标签: java java-9

我刚刚阅读了有关此Java 9功能https://bugs.openjdk.java.net/browse/JDK-8085796的信息,说“慢”'使用StringBuilder的字符串连接将得到改进。

所以我的问题是,是否仍然存在以下方式对String进行int转换的任何缺点?

int i = 16;
String s = ""+i;

或者是否有使用Integer.toString(i)String.valueOf(i)将int强制转换为字符串的优缺点?

编辑:由于我的问题太基于意见(sry for that),我改变了它。我对不同铸件的积极或消极方面感兴趣。每个人都应该自己决定使用哪一个。

1 个答案:

答案 0 :(得分:6)

首先,Integer.toString(i)始终比""+i更快的假设不成立。

最值得注意的是,如果i是编译时常量,""+i也是String.valueOf(i),与final int i=16;相反。当然,如果定义类似于""+i,读者会反对使用"16",因为final int DEFAULT_USER = DEFAULT_GROUP << GROUP_BIT;会更加清晰。但是如果我们谈论""+DEFAULT_USERcase比包含实际数字的文字字符串更清晰。作为编译时常量不仅仅是性能问题,它允许在注释中使用字符串或switch语句的i标签。

如果""+i不是编译时常量,则没有强制编译形式,因此原则上允许编译器将Integer.toString(i)编译为new StringBuilder().append("").append(i).toString()。如果我们将通常的幼稚(或称之为“直截了当”)实现Integer.toString(i)StringBuilder变体或假设的优化Java 9实现进行比较,只需要{{1}的最终复制操作结果String的值数组的缓冲区可能会对性能产生影响,但HotSpot JVM可以对其进行优化。 Java 9解决方案针对的另一个问题StringBuilder的初始容量与此无关,因为int的字符串表示很容易符合{{1}的默认容量} 16 s。

对于大多数非常重要的char值,转换为小数表单的成本将显着超过其他成本,因此如果您希望int超过""+i,则不应让性能问题是不使用它的原因。这也意味着您不应期望Java 9实现具有明显的加速。主要操作仍然是相同的。

我认为,Java 9解决方案的最大改进是减少代码大小,因为为每个字符串连接表达式生成的所有这些类似的调用序列将折叠为一条指令(这与多个表达式的连接尤其相关)。提高性能的机会只是一个很好的附加组件,但我不认为这些改进是戏剧性的,特别是在第一版JRE 9中没有。

因此,Integer.toString(i)""+iInteger.toString(i)之间的决定仅仅是一个风格问题(我们在此不再讨论),而不是性能问题。