8

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

所以我的问题是,以下列方式对 String 进行 int 转换是否还有任何缺点?

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

Integer.toString(i)或者使用or将 int 转换为 String 有什么优点/缺点String.valueOf(i)

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

4

1 回答 1

6

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

最值得注意的是,ifi是一个编译时间常数,""+iString.valueOf(i). 当然,如果定义像final int i=16;,读者会反对使用""+i"16"这样会更清楚。但是,如果我们谈论final int DEFAULT_USER = DEFAULT_GROUP << GROUP_BIT;,""+DEFAULT_USER比包含实际数字的文字字符串要清晰得多。作为一个编译时常量不仅仅是一个性能问题,它允许在语句的注释或case标签中使用字符串。switch

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

对于大多数非平凡int值,转换为十进制形式的成本将大大超过其他成本,因此如果您更喜欢""+iInteger.toString(i)您不应该让性能问题成为不使用它的理由。这也意味着您不应该期望 Java 9 实现的显着加速。主要操作还是一样的。

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

所以""+iand Integer.toString(i)or之间的决定String.valueOf(i)只是一个风格问题(我们在这里不讨论),而不是性能问题。

于 2016-11-10T17:01:01.850 回答