Java 编译器如何处理 StringBuilder(a + b + c + d)?

Sou*_*tes 1 java stringbuilder

我正在处理一个包含大量遗留代码的应用程序。我经常看到的是在 StringBuilder 参数中使用“+”进行字符串连接。
例子:

StringBuilder sb = new StringBuilder("This "
        + "looks "
        + "rather "
        + "weird "
        + "to "
        + "me.") 
Run Code Online (Sandbox Code Playgroud)

据我所知,编译器用 StringBuilder().append() 替换了使用 + 运算符的字符串连接。
恐怕现在编译器会创建一个临时的 StringBuilder 来执行连接,然后转换为 String() 并将结果插入现有的 StringBuilder。

我的问题是:编译器是否能够优化嵌套的 StringBuilder?如果不是,我应该重写代码以节省几个 CPU 周期吗?它显然是有效的,但每当我看着它时它都会伤害我的眼睛。

感谢您的任何见解!

k31*_*159 5

编译器优化字符串文字常量的串联:

StringBuilder sb = new StringBuilder("This "
        + "looks "
        + "rather "
        + "weird "
        + "to "
        + "me.");
Run Code Online (Sandbox Code Playgroud)

在运行时完全等效于:

StringBuilder sb = new StringBuilder("This looks rather weird to me.");
Run Code Online (Sandbox Code Playgroud)

这也适用于任何 String 编译时常量,而不仅仅是文字。

您可能已经阅读过的问题是使用非常量时:

StringBuilder sb = new StringBuilder("This "
        + arg1
        + var2);
Run Code Online (Sandbox Code Playgroud)

相当于:

StringBuilder sb = new StringBuilder(new StringBuilder("This ")
        .append(arg1)
        .append(var2)
        .toString());
Run Code Online (Sandbox Code Playgroud)

如果您将其重新编写为:

StringBuilder sb = new StringBuilder("This ")
        .append(arg1)
        .append(var2);
Run Code Online (Sandbox Code Playgroud)

  • 如果字符串生成器不用于其他任何用途,则将其替换为 `"This " + arg1 + var2` 会更有效。仅当涉及条件片段或循环时,处理“StringBuilder”才有意义。顺便说一句,编译时常量折叠适用于所有常量,而不仅仅是字符串,例如“a”+1+“b”被编译为“a 1 b”。 (2认同)