Java 在StringBuilder append()语句中进行连接所需的执行时间是否与使用两个append()语句所需的执行时间不同?
我想知道,如果程序员在Stringbuilder append()语句中串联,或者只使用两个append语句而不是一个,执行速度会发生变化 我问这个问题是为了帮助我弄清楚,当我们可以连接时,为什么要使用StringBuilder类 连接示例:Java 在StringBuilder append()语句中进行连接所需的执行时间是否与使用两个append()语句所需的执行时间不同?,java,string,append,concatenation,stringbuilder,Java,String,Append,Concatenation,Stringbuilder,我想知道,如果程序员在Stringbuilder append()语句中串联,或者只使用两个append语句而不是一个,执行速度会发生变化 我问这个问题是为了帮助我弄清楚,当我们可以连接时,为什么要使用StringBuilder类 连接示例: public class MCVE { public static void main(String[] args) { String[] myArray = {"Some", "stuff", "to", "append", "
public class MCVE {
public static void main(String[] args) {
String[] myArray = {"Some", "stuff", "to", "append", "using", "the",
"StringBuilder", "class's", "append()", "method"};
StringBuilder stringBuild = new StringBuilder();
for(String s: myArray) {
stringBuild.append(s + " ");
}
}
}
public class MCVE {
public static void main(String[] args) {
String[] myArray = {"Some", "stuff", "to", "append", "using", "the",
"StringBuilder", "class's", "append()", "method"};
StringBuilder stringBuild = new StringBuilder();
for(String s: myArray) {
stringBuild.append(s);
stringBuild.append(" ");
}
}
}
Double-Append()示例:
public class MCVE {
public static void main(String[] args) {
String[] myArray = {"Some", "stuff", "to", "append", "using", "the",
"StringBuilder", "class's", "append()", "method"};
StringBuilder stringBuild = new StringBuilder();
for(String s: myArray) {
stringBuild.append(s + " ");
}
}
}
public class MCVE {
public static void main(String[] args) {
String[] myArray = {"Some", "stuff", "to", "append", "using", "the",
"StringBuilder", "class's", "append()", "method"};
StringBuilder stringBuild = new StringBuilder();
for(String s: myArray) {
stringBuild.append(s);
stringBuild.append(" ");
}
}
}
从理论上讲,是的,连接版本需要更长的时间,因为在封面下,它会创建一个全新的
StringBuilder
,追加s
,追加“
,然后使用toString
创建(!)一个字符串,以便将其传递到您编码的追加
。(编译器就是这么做的。要了解您的具体情况,您需要测试实际代码的代表性。毕竟,如果JIT在运行时是一个热点,那么它将参与其中。)
当然,你可能不会注意到。但是,如果您已经在使用StringBuilder
,请使用它(改为执行两次append
)
(如果以上第一段都是字符串文字,例如
“foo”+“bar”
。编译器会进行连接。)stringBuild.append;stringBuild.append(“”)代码>可以简化为`stringBuild.append.append(“”)代码>,顺便说一句,您可以使用String.join(“,myArray”)完成整个逻辑代码>@Aomine我不知道,谢谢@Aomine直指问题的核心。:-)非常感谢。所以我想我们只是使用StringBuilder来避免在多次连接字符串时反复创建StringBuilder对象?@LuminousNutria-是的,在性能(速度和内存消耗)比代码清晰度更重要的情况下。这很少,但有时。但是如果经常出现这种情况,您可能会看到是否有某种已构建并测试过的模板引擎或库可以替代。两个stringbuilder操作可能比串联更快,但为什么不测试它呢?使用System.nanoTime()查看大量运行for循环所需的时间。@stegzz-或.:-)毕竟,就编译器创建的字节码而言,上面的内容是正确的,但是如果JIT是代码中的热点,那么它将参与其中。