多个System.out.print()和串联之间的区别

时间:2017-02-06 20:30:11

标签: java string

基本上,我想知道哪种方法更好,

for(int i = 0; i < 10000; i++){
    System.out.print("blah");
}
System.out.println("");

String over_9000_blahs = "";
for(int i = 0; i < 10000; i++){
    over_9000_blahs += "blah";
}
System.out.println(over_9000_blahs);

还是有更好的方式我不知道?

5 个答案:

答案 0 :(得分:5)

如果要在(较大的计数)循环中连接字符串,则需要使用StringBuilder

for(int i = 0; i < 10000; i++){
    over_9000_blahs += "blah";
}

每次迭代的作用

  • 在内部创建一个新的StringBuilder,内部char数组足以容纳中间结果(over_9000_blahs
  • over_9000_blahs中的字符复制到内部数组
  • 复制"blah"
  • 中的字符
  • 创建新的String,再次复制内部数组中的字符

这是每次迭代越来越长的字符串的两个副本 - 这意味着二次时间复杂度。

System.out.println() might be synchronized起,重复调用它的可能性比使用StringBuilder要慢(但我的猜测是它会比使用+=)连接循环中的字符串。

所以StringBuilder方法应该是三者中最好的。

答案 1 :(得分:4)

由于您只是写System.out,所以第一种方法更好如果性能对您很重要,请使用以下方法(System.out.println已同步并使用锁定 - 可以阅读更多相关信息herehere)。

如果您想稍后使用“大字符串”或提高性能,使用StringBuilder会更清晰。 (见下文),任何字符串+将由编译器转换为StringBuilder(更多详情here

        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < 10000; i++){
            stringBuilder.append("bla");
        }
        System.out.println(stringBuilder.toString());

答案 2 :(得分:2)

按绩效顺序:

  1. StringBuilder - 最快的。基本上,它只是将单词添加到一个字符数组中。当容量不够时,它就会倍增。应该不超过log(10000)次。

  2. System.out.print - 与StringBuilder相比,它的效果不佳,因为我们需要锁定out 10000次。此外,打印会创建新的char[writeBufferSize] 10000次,而在StringBuilder选项中,我们只会执行1次这样的操作!

  3. 连接字符串。创建许多(以及后来的)对象,启动某些“i”内存管理会严重影响性能。

  4. 编辑:

    更准确一点,因为问题是关于选项2和选项3 之间的区别,并且很明显为什么Stringbuilder速度很快。< / p>

    我们可以说第二种方法中的每次迭代都需要K次,因为代码是相同的,并且每次迭代的字符串长度都相同。在执行结束时,第二个选项将花费10000 * K时间进行10000次迭代。我们不能对第三种方法说同样的原因,因为每次迭代时字符串的长度总是增加。所以分配对象的时间和收集它们的垃圾增加。我想说的是执行时间在第三个选项中没有线性增加。 因此,对于低NumberOfIterations,我们可能不会看到最后两种方法之间的差异。但我们知道,第二个选项的特定NumberOfIterations始终优于第三个选项。

答案 3 :(得分:0)

在这种情况下,我说第一个更好。 Java使用StringBuilders进行字符串连接以提高性能,但由于Java不知道你在第二种情况下反复使用循环进行连接,所以第一种情况会更好。

答案 4 :(得分:0)

如果您只想输出值 - 结果是相同的。

第二个选项将在内存中创建许多字符串,GC(垃圾收集器)将负责处理。 (但是在较新版本的Java中,这个问题不会发生,因为会将场景转换为场景下的StringBuilder解决方案)

如果你想稍后在sysout之后使用你的字符串,你应该检查StringBuilder类和append方法:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 10000; i++){
    sb.append("blah");
}
System.out.println(sb);