Java 9 整数转换为字符串
Java 9 integer to String cast
我刚读到 Java 9 功能 https://bugs.openjdk.java.net/browse/JDK-8085796 说 'slow' 使用 StringBuilder 的字符串连接将得到改进。
所以我的问题是,按以下方式将 int 转换为 String 是否还有任何缺点?
int i = 16;
String s = ""+i;
或者是否有使用 Integer.toString(i)
或 String.valueOf(i)
将 int 转换为 String 的任何 pros/cons?
编辑:由于我的问题过于基于个人意见(抱歉),我更改了它。我对不同铸件的正面或负面感兴趣。每个人都应该自己决定使用哪一个。
首先,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
比包含实际数字的文字字符串要清楚得多。作为编译时常量不仅仅是一个性能问题,它允许在注释或 switch
语句的 case
标签中使用字符串。
如果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
和Integer.toString(i)
或String.valueOf(i)
之间的决定只是一个风格问题(我们不在这里讨论),而不是性能问题。
我刚读到 Java 9 功能 https://bugs.openjdk.java.net/browse/JDK-8085796 说 'slow' 使用 StringBuilder 的字符串连接将得到改进。
所以我的问题是,按以下方式将 int 转换为 String 是否还有任何缺点?
int i = 16;
String s = ""+i;
或者是否有使用 Integer.toString(i)
或 String.valueOf(i)
将 int 转换为 String 的任何 pros/cons?
编辑:由于我的问题过于基于个人意见(抱歉),我更改了它。我对不同铸件的正面或负面感兴趣。每个人都应该自己决定使用哪一个。
首先,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
比包含实际数字的文字字符串要清楚得多。作为编译时常量不仅仅是一个性能问题,它允许在注释或 switch
语句的 case
标签中使用字符串。
如果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
和Integer.toString(i)
或String.valueOf(i)
之间的决定只是一个风格问题(我们不在这里讨论),而不是性能问题。