Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在StringBuilder append()语句中进行连接所需的执行时间是否与使用两个append()语句所需的执行时间不同?_Java_String_Append_Concatenation_Stringbuilder - Fatal编程技术网

Java 在StringBuilder append()语句中进行连接所需的执行时间是否与使用两个append()语句所需的执行时间不同?

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", "

我想知道,如果程序员在Stringbuilder append()语句中串联,或者只使用两个append语句而不是一个,执行速度会发生变化

我问这个问题是为了帮助我弄清楚,当我们可以连接时,为什么要使用StringBuilder类

连接示例:

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是代码中的热点,那么它将参与其中。