3 回答

TA貢獻1829條經(jīng)驗 獲得超13個贊
我使用了hhafez代碼并添加了一個內(nèi)存測試:
private static void test() {
Runtime runtime = Runtime.getRuntime();
long memory;
...
memory = runtime.freeMemory();
// for loop code
memory = memory-runtime.freeMemory();
我為每種方法,“ +”運算符String.format和StringBuilder(調(diào)用toString())分別運行此命令,因此所使用的內(nèi)存不會受到其他方法的影響。我添加了更多串聯(lián),使字符串成為“ Blah” + i +“ Blah” + i +“ Blah” + i +“ Blah”。
結(jié)果如下(每次平均運行5次):
接近時間(毫秒)分配的內(nèi)存(長)
'+'運算符747 320,504
String.format 16484 373,312
StringBuilder 769 57,344
我們可以看到String'+'和StringBuilder在時間上實際上是相同的,但是StringBuilder在內(nèi)存使用方面效率更高。當我們在足夠短的時間間隔內(nèi)進行許多日志調(diào)用(或任何其他其他涉及字符串的語句)時,這非常重要,這樣垃圾收集器將無法清理由'+'運算符引起的許多字符串實例。
還有一個注意事項,順便說一句,不要忘記在構(gòu)造消息之前檢查日志記錄級別。
結(jié)論:
我將繼續(xù)使用StringBuilder。
我的時間太多或生活太少。

TA貢獻1856條經(jīng)驗 獲得超17個贊
JAVAC 1.6會自動將您以前的丑陋樣式編譯為:
StringBuilder sb = new StringBuilder("What do you get if you multiply ");
sb.append(varSix);
sb.append(" by ");
sb.append(varNine);
sb.append("?");
String s = sb.toString();
因此,這與使用StringBuilder絕對沒有區(qū)別。
String.format具有更大的重量,因為它創(chuàng)建了一個新的Formatter,解析了您的輸入格式字符串,創(chuàng)建了一個StringBuilder,將所有內(nèi)容附加到它并調(diào)用toString()。
添加回答
舉報