![](/img/trans.png)
[英]Does "+" concatenation operation in java in System.out.print() consume memory?
[英]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());
按性能順序:
StringBuilder
- 最快的。 基本上,它只是將單詞添加到一個字符數組中。 當容量不夠時,它就會倍增。 應該發生不超過log(10000)次。
System.out.print
-它有糟糕的表現比較StringBuilder
,因為我們需要鎖定out
10000次。 另外,print創建了新的char[writeBufferSize]
10000次,而在StringBuilder
選項中,我們只做了1次!
連接字符串。 創建許多 (以及后來也很大的 )對象,啟動一些“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.