基本上,我想知道哪种方法更好,
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);
还是有更好的方式我不知道?
答案 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
已同步并使用锁定 - 可以阅读更多相关信息here和here)。
如果您想稍后使用“大字符串”或提高性能,使用StringBuilder会更清晰。
(见下文),任何字符串+
将由编译器转换为StringBuilder
(更多详情here)
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < 10000; i++){
stringBuilder.append("bla");
}
System.out.println(stringBuilder.toString());
答案 2 :(得分:2)
按绩效顺序:
StringBuilder
- 最快的。基本上,它只是将单词添加到一个字符数组中。当容量不够时,它就会倍增。应该不超过log(10000)次。
System.out.print
- 与StringBuilder
相比,它的效果不佳,因为我们需要锁定out
10000次。此外,打印会创建新的char[writeBufferSize]
10000次,而在StringBuilder
选项中,我们只会执行1次这样的操作!
连接字符串。创建许多(以及后来的大)对象,启动某些“i”内存管理会严重影响性能。
编辑:
更准确一点,因为问题是关于选项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);