簡體   English   中英

多個System.out.print()和串聯之間的區別

[英]Difference between multiple System.out.print() and concatenation

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

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);

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

如果你在一個(更大的計數)循環中連接字符串,你想使用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() 可能是同步的 ,因此重復調用它可能比使用StringBuilder慢(但我的猜測是它不會比使用+=連接循環中的字符串慢)。

所以StringBuilder方法應該是三者中最好的。

因為您只是寫入System.out所以第一種方法更好但是如果性能對您使用下面的方法很重要( System.out.println是同步的並且使用鎖定 - 可以在這里這里閱讀更多關於它的信息 )。

如果您想稍后使用“大字符串”或提高性能,使用StringBuilder會更清晰。 (見下文),任何字符串+將由編譯器轉換為StringBuilder (更多細節在這里

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

按性能順序:

  1. StringBuilder - 最快的。 基本上,它只是將單詞添加到一個字符數組中。 當容量不夠時,它就會倍增。 應該發生不超過log(10000)次。

  2. System.out.print -它有糟糕的表現比較StringBuilder ,因為我們需要鎖定out 10000次。 另外,print創建了新的char[writeBufferSize] 10000次,而在StringBuilder選項中,我們只做了1次!

  3. 連接字符串。 創建許多 (以及后來也很大的 )對象,啟動一些“i”內存管理將嚴重影響性能。

編輯:

更准確一點,因為問題是關於選項2和選項3之間的區別,並且很清楚為什么Stringbuilder很快。

我們可以說第二種方法中的每次迭代都需要K時間,因為代碼是相同的,並且每次迭代的字符串長度都相同。 在執行結束時,第二個選項將花費10000 * K時間進行10000次迭代。 我們不能對第三種方法說同樣的原因,因為每次迭代時字符串的長度總是在增加 因此,分配對象和收集它們的垃圾的時間越來越多 我想說的是執行時間在第三個選項中沒有線性增加。 因此,對於低NumberOfIterations我們可能不會看到最后兩種方法之間的差異。 但我們知道,啟動特定的NumberOfIterations第二個選項總是比第三個選項好。

在這種情況下,我會說第一個更好。 Java使用StringBuilders進行字符串連接以提高性能,但由於Java不知道你在第二種情況下反復使用循環連接,所以第一種情況會更好。

如果您只想sysout您的值 - 結果是相同的。

第二個選項將在內存中創建許多字符串,GC(垃圾收集器)將負責處理。 (但是在較新版本的Java中,這個問題不會發生,因為concating將被轉換為場景下面的StringBuilder解決方案)

如果你想稍后在sysout之后使用你的字符串,你應該檢查StringBuilder類並append方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM