![](/img/trans.png)
[英]Is it better practice to use String.format over string Concatenation in Java?
[英]String.format() vs string concatenation performance
這兩個成語之間的表現有什么不同嗎?
String firstStr = "Hello ";
String secStr = "world";
String third = firstStr + secStr;
和
String firstStr = "Hello ";
String secStr = "world";
String third = String.format("%s%s",firstStr , secStr);
我知道用+運算符連接對性能有害,特別是如果操作很多次,但是String.format()呢? 它是相同的還是有助於提高性能?
第二個將更慢(如果您查看String.format()
的源代碼,您將看到原因)。 這只是因為String.format()
執行的代碼比簡單的連接要多得多。 在一天結束時,兩個代碼版本都會創建3個String
實例。 正如其他人已經指出的那樣,使用String.format()
還有其他原因,而不是性能相關。
首先,我只想對免於過早優化做出免責聲明。 除非你有理由相信這將成為你程序中的熱點,否則只需選擇最適合你程序的結構。
如果你有理由相信,但是,要加強對拼接好的控制,只需使用StringBuilder
直接。 這就是內置級聯操作所做的事情,並且沒有理由認為它很慢。 只要你保持相同的StringBuilder
並繼續附加它,而不是冒險連續創建幾個(必須用先前創建的數據“初始化”),你將有適當的O(n)性能。 特別是如果你確保用適當的容量初始化StringBuilder
。
然而,這也說,如上所述, StringBuilder
是內置連接操作所使用的,所以如果你只是保持所有連接“內聯” - 也就是說,使用A + B + C + D
,而不是比如e = A + B
然后是f = C + D
然后是e + f
(這樣,在整個操作過程中使用相同的StringBuilder
並附加) - 然后就沒有理由認為它會很慢。
編輯:在回復你的評論時,我會說String.format
總是比較慢。 即使它以最佳方式附加,它也不能比StringBuilder
更快 (因此也是串聯操作),但它還必須創建一個Formatter
對象,解析輸入字符串,等等。 所以它還有更多,但它仍然無法更快地完成基本操作。
此外,如果您在內部查看Formatter
工作方式,您會發現它(默認情況下)也使用StringBuilder
,就像連接操作一樣。 因此,它執行完全相同的基本操作 - StringBuilder
提供您提供的字符串。 它只是以更加迂回的方式進行。
正如在這個優秀的答案中所描述的,您寧願使用String.format,但主要是因為本地化問題。
假設你必須為不同的語言提供不同的文本,在這種情況下然后使用String.format - 你可以插入新的語言(使用資源文件)。 但連接會留下凌亂的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.