亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果性能很重要,我應該使用Java的String.format()嗎?

如果性能很重要,我應該使用Java的String.format()嗎?

飲歌長嘯 2019-10-23 16:36:14
我們必須一直構建String以便進行日志輸出等等。在JDK版本中,我們了解了何時使用StringBuffer(很多追加,線程安全)和StringBuilder(很多追加,非線程安全)。有什么使用建議String.format()?是高效的,還是在性能很重要的情況下,我們被迫堅持采用單線連接?例如丑陋的舊風格,String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";與整潔的新樣式(String.format,可能會更慢)相比,String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);注意:我的特定用例是整個代碼中數百個“單行”日志字符串。它們不涉及循環,所以StringBuilder也太重了。我String.format()特別感興趣。
查看完整描述

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。

我的時間太多或生活太少。


查看完整回答
反對 回復 2019-10-23
?
繁花如伊

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()。


查看完整回答
反對 回復 2019-10-23
  • 3 回答
  • 0 關注
  • 4334 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號