簡體   English   中英

String.format()vs字符串連接性能

[英]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 - 你可以插入新的語言(使用資源文件)。 但連接會留下凌亂的代碼。

請參閱: 在Java中使用String.format而不是字符串連接更好嗎?

暫無
暫無

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

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