Java编译器如何处理StringBuilder(a+b+c+d)?
我正在处理一个包含大量遗留代码的应用程序。我经常看到的是在 StringBuilder 参数中使用“+”进行字符串连接。
例子:
StringBuilder sb = new StringBuilder("This "
+ "looks "
+ "rather "
+ "weird "
+ "to "
+ "me.")
据我所知,编译器用 StringBuilder().append() 替换了使用 + 运算符的字符串连接。
恐怕现在编译器会创建一个临时的 StringBuilder 来执行连接,然后转换为 String() 并将结果插入现有的 StringBuilder。
我的问题是:编译器是否能够优化嵌套的 StringBuilder?如果不是,我应该重写代码以节省几个 CPU 周期吗?它显然是有效的,但每当我看着它时它都会伤害我的眼睛。
感谢您的任何见解!
回答
编译器优化字符串文字常量的串联:
StringBuilder sb = new StringBuilder("This "
+ "looks "
+ "rather "
+ "weird "
+ "to "
+ "me.");
在运行时完全等效于:
StringBuilder sb = new StringBuilder("This looks rather weird to me.");
这也适用于任何 String 编译时常量,而不仅仅是文字。
您可能已经阅读过的问题是使用非常量时:
StringBuilder sb = new StringBuilder("This "
+ arg1
+ var2);
相当于:
StringBuilder sb = new StringBuilder(new StringBuilder("This ")
.append(arg1)
.append(var2)
.toString());
如果您将其重新编写为:
StringBuilder sb = new StringBuilder("This ")
.append(arg1)
.append(var2);
- If the string builder is not used for anything else, replacing it with `"This " + arg1 + var2` is even more efficient. Dealing with a `StringBuilder` only pays off when conditional fragments or loops are involved. By the way, the compile-time constant folding applies to all constants, not only strings, e.g. `"a " + 1 + " b"` get compiled to `"a 1 b"`.