2011-07-13 25 views
6

由於Java中的字符串是不可變的,我一直使用StringBuilder或StringBuffer來連接字符串。 String.format()方法是否像StringBuilder或StringBuffer一樣處理這個問題?換句話說,String.format()是否像StringBuffer或StringBuilder一樣管理內存?在Java中,是否在String.format()的實現中考慮了Strings的不變性?

+9

(1)這是特定於實現的。 (2)直到你有數據顯示它不能很好地工作,無論它如何被實施,它都可以工作。 (3)正如在第2條中所暗示的那樣,並且作爲*總是*帶有這樣的問題,唯一確定的方法是描述。 – delnan

回答

4

基於Oracle JDK的源代碼,似乎該實現爲每個String#format調用創建一個新的Formatter,然後爲每個調用分配一個新的StringBuilder。所以是的。但正如你對問題的評論所提到的那樣,雖然常識意味着它會選擇最有效的做事方式,但這是非常多的實現細節。

+0

有趣,謝謝!因此,作爲後續工作,由於StringBuilder不是線程安全的,因此我認爲String.format()也不是線程安全的......至少是Oracle實現? – fooMonster

+1

如果每次格式調用都會創建一個新的StringBuilder並將其保留在方法的本地,那麼對格式的調用仍然可以是線程安全的。 –

+0

@Michael「仍然可以線程安全」?這聽起來像是暗示開發人員可以通過以線程安全的方式調用String.format()來使其線程安全。顯然。也許我不清楚。跟進,以及原來的問題是關於String.format()的實現。所以我的後續會更好擺在「由於String.format()的實現依賴於Oracle實現中的StringBuilder,並且由於我們知道StringBuilder不是線程安全的,這是否意味着實現String.format()在oracle的jdk中也不是線程安全的?「 – fooMonster

相關問題