2012-06-13 62 views
1

我正在努力提高我的應用程序的性能。我感到困惑下列哪項將使用更多的內存:這SB是StringBuffer什麼將使用更多的內存

String strWithLink = sb.toString(); 
clickHereTextview.setText(
    Html.fromHtml(strWithLink.substring(0,strWithLink.indexOf("+")))); 

OR

clickHereTextview.setText(
    Html.fromHtml(sb.toString().substring(0,sb.toString().indexOf("+")))); 

回答

3

存儲器表達如

sb.toString().indexOf("+") 

術語具有很少或幾乎沒有影響,因爲該字符串將被垃圾收集評估之後。 (爲了避免甚至臨時內存使用情況,我建議做

sb.indexOf("+") 

雖然代替。)

然而,有涉及到potential leak當您使用String.substring。上次我檢查了substring基本上返回了原始字符串的視圖,所以原始字符串仍然駐留在內存中。

的解決方法是做

String strWithLink = sb.toString(); 
... new String(strWithLink.substring(0,strWithLink.indexOf("+"))) ... 
    ^^^^^^^^^^ 

以分離期望字符串,從原來的(可能很大)的字符串。這同樣適用於String.split如在這裏討論:

1

創建新的對象總是佔用更多的內存。但是,在你的情況下,差異似乎微不足道。

另外,就你而言,你正在創建一個佔用堆空間的局部變量。

每當在您的方法中有多個位置參考時,使用 String strWithLink = sb.toString();時您可以隨處使用相同的strWithLink。否則,如果只有一個參考,那麼最好直接使用sb.toString();


1

檢查別人的答案,第二個確實需要多一點點的內存,但是這聽起來像你是在優化。保持你的代碼清晰可讀應該是優先考慮的事情。如果可讀性受到影響,我建議你不要太擔心這種微小的優化。

2

分析

如果我們看一下StringBuilder's OpenJDK sources

public String toString() { 
    // Create a copy, don't share the array 
    return new String(value, 0, count); 
} 

我們看到,它實例化一個全新的String對象。它將字符串池中的許多新實例放置在多次調用sb的位置。的toString()。

成果

使用String strWithLink = sb.toString();,重用它會從池中檢索字符串的同一個實例,而不是新的。

+1

...甚至更好,不叫'sb.toString'查找索引'+'可言,只是做' sb.indexOf( 「+」)'。 – aioobe

1

你做的工作越少,效率就越高。在這種情況下,你不需要調用toString所有

clickHereTextview.setText(Html.fromHtml(sb.substring(0, sb.indexOf("+")))); 
+0

其實setText(String str)只接受字符串。 – Rookie

+0

'substring()'只返回'String' –

+0

哦:)謝謝... – Rookie

相關問題