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

Sce*_*fOd 8 java string

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

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

要么

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

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

Mzf*_*Mzf 5

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

如果您想稍后使用“大字符串”或提高性能,使用StringBuilder 会更干净。(见下文),anycase String+StringBuilder被编译器转换为(更多细节在这里

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


Jir*_*sek 5

StringBuilder如果你在一个(更大的计数)循环中连接字符串,你想使用.

for(int i = 0; i < 10000; i++){
    over_9000_blahs += "blah";
}
Run Code Online (Sandbox Code Playgroud)

这样做对于每次迭代:

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

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


因为System.out.println() 可能是同步的,所以有可能重复调用它会比使用慢StringBuilder(但我的猜测是它不会比使用循环连接字符串慢+=).

所以这种StringBuilder方法应该是三者中最好的.


归档时间:

查看次数:

779 次

最近记录:

8 年,9 月 前