2012-06-13 29 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

相关问题