2017-03-08 45 views
1

當前,當javac遇到String連接時,它會將代碼轉換爲使用StringBuilder。例如:繞過字符串連接所需的解決方法

String a = String.valueOf(System.currentTimeMillis()); 
    String b = String.valueOf(System.currentTimeMillis()); 
    String c = String.valueOf(System.currentTimeMillis()); 
    String d = a + b + c + "_IND"; 

變得像

String d = new StringBuilder().append(a).append(b).append(c).append("_IND"); 

由於StringBuilder的是沒有明確大小,則使用缺省大小和經常導致expandCapacity在運行時調用默認的尺寸太小。

在分析應用程序時,我們看到很多這樣的操作,例如爲各種HashMaps構建密鑰,爲JSF中的每個元素構建唯一密鑰等,這會導致額外的內存使用量。

有沒有更好的方法來減少這種情況。

+0

既然你只追加currentTimeMillis,你最初的想法是StringBuilder的大小不是?有些東西_like_新的StringBuilder(System.currentTimeMillis()。toString()。length * 3 + 4) –

+0

沒有,這只是一個例子,每次他們使用字符串生成器時可以使用任何東西來進行concatination –

+0

[最有效的初始容量大小爲StringBuilder?](http://stackoverflow.com/questions/13360229/most-efficient-initial-capacity-size-for-stringbuilder) – Jeremy

回答

2

在您嘗試在 StringBuilder的它總是wiseable解釋大 串的大小,並用稍微多於 估計大小作爲其默認容量初始化StringBuider插入大串案件。

推導出一個經驗公式,以提出StringBuilder的初始化容量,以便控制低估和高估大小的成本。

因爲StringBuilder存儲了以char數組形式構建的字符串。 StringBuilder的容量是這個數組的長度。一旦數組溢出,將分配一個新的(較長的)數組,並將內容傳遞給它。這使得容量上升。

相關問題