我刚刚读到了这个Java 9特性https://bugs.openjdk.java.net/browse/JDK-8085796,它说使用StringBuilder的'慢'字符串连接将得到改进.
所以我的问题是,对于使用String进行int转换是否还有任何缺点:
int i = 16;
String s = ""+i;
Run Code Online (Sandbox Code Playgroud)
或者是否有使用Integer.toString(i)或使用int将int转换为String的优缺点String.valueOf(i)?
编辑:由于我的问题太基于意见(sry),我改变了它.我对不同铸件的积极或消极方面感兴趣.每个人都应该自己决定使用哪一个.
首先,假设Integer.toString(i)总是比""+i不成立更快.
最值得注意的是,如果i是编译时间常数,""+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)反正.如果我们将通常的naive(或让我们称之为"直接")实现new StringBuilder().append("").append(i).toString()与Integer.toString(i)变体或假设的优化Java 9实现进行比较,那么从StringBuilder缓冲区到结果String的值数组的最终复制操作可能会有一个性能影响,但这可以通过HotSpot JVM进行优化.Java 9解决方案的另一个问题StringBuilder是初始容量,这里没有相关性,因为int字符串表示很容易适应16 chars 的默认容量.
对于大多数非常重要的int值,转换为小数形式的成本将显着超过其他成本,因此如果您更喜欢""+i,Integer.toString(i)则不应将性能问题作为不使用它的原因.这也意味着您不应期望Java 9实现具有明显的加速.主要操作仍然是一样的.
我认为,Java 9解决方案的最大改进是减小了代码大小,因为为每个字符串连接表达式生成的所有这些类似的调用序列将折叠为一条指令(这与多个表达式的连接尤其相关).提高性能的机会只是一个很好的附加组件,但我不认为这些改进是戏剧性的,特别是在第一版JRE 9中没有.
因此,""+i和Integer.toString(i)/ 之间的决定String.valueOf(i)只是一个风格问题(我们在此不讨论),而不是性能问题.
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |