3 回答

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

TA貢獻2012條經驗 獲得超12個贊
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絕對沒有區別。
String.format具有更大的重量,因為它創建了一個新的Formatter,解析了您的輸入格式字符串,創建了一個StringBuilder,將所有內容附加到它并調用toString()。
添加回答
舉報