2017-04-04 38 views
2

我幾乎總是使用StringBuilder(int)來避免愚蠢的重新分配與微小的默認容量。任何javac實現都沒有做任何特殊的事情來爲串聯中的StringBuilder的隱式使用使用合​​適的容量嗎?給定文字長度,"abcdefghijklmnopqrstuvwxyz" + numbers + "!.?:"至少會使用30的初始容量?隱式StringBuilder大小

回答

4

是的,它會在Java 9中變得聰明 - 實際上更聰明 - (這是我可以鬆散地聲稱自己是我的一部分 - 我made最初的建議是預設StringBuilders,啓發了他們最終採用的更好,更強大的方法。)

http://openjdk.java.net/jeps/280除其他問題外,還特別提到「有時我們需要適當地預設StringBuilder」,這是一個具體的改進。

(而這個故事的寓意是,簡單地和可讀性很強地編寫代碼,讓編譯器和JIT採取的適當他們的工作最優化的服務。)

0

這可能取決於你的編譯器版本,設置等

爲了測試這一點,我創建了一個簡單的方法:

public static void main(String[] args) { 
    System.out.println("abcdefghijklmnopqrstuvwxyz" + args[0] + "!.?:"); 
} 

和編譯,然後通過反編譯它運行後,我們得到以下結果:

System.out.println((new StringBuilder()).append("abcdefghijklmnopqrstuvwxyz").append(args[0]).append("!.?:").toString()); 

所以看起來,至少在某些javac版本中,它只是使用默認值。

手動檢查字節碼錶示相同的事情。