什么会使用更多的内存

时间:2012-06-13 08:28:25

标签: java string stringbuffer

我正致力于改善应用的性能。我很困惑以下哪个会使用更多内存:这里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("+"))));

6 个答案:

答案 0 :(得分:3)

内存而言一个表达式,如

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

几乎没有影响,因为字符串将在评估后立即进行垃圾收集。 (为了避免临时使用内存,我建议你做

sb.indexOf("+")
相反,

。)

但是,使用String.substring时会涉及potential leak。上次我检查substring基本上返回原始字符串的视图,因此原始字符串仍然驻留在内存中。

解决方法是

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

从原始(可能很大的)字符串中分离所需的字符串。同样适用于此处讨论的String.split

答案 1 :(得分:2)

第二个将使用更多内存,因为每次调用StringBuilder#toString()都会创建一个新的String实例。

http://www.docjar.com/html/api/java/lang/StringBuilder.java.html

答案 2 :(得分: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();,重用它将从池中检索相同的String实例,而不是新的。

答案 3 :(得分:1)

创建新对象总是占用更多内存。但是,在你的情况下,差异似乎微不足道。

此外,在您的情况下,您正在创建一个占用堆空间的局部变量。

只要您的方法中有多个位置的引用,就可以使用它 String strWithLink = sb.toString();,因为您可以在任何地方使用相同的strWithLink。否则,如果只有一个引用,最好直接使用sb.toString();


答案 4 :(得分:1)

检查其他人的答案,第二个确实需要更多的内存,但这听起来好像你已经过度优化了。保持代码清晰可读应该是首要任务。如果可读性受到影响,我建议你不要太担心这种微小的优化。

答案 5 :(得分:1)

你做的工作越少,通常效率就越高。在这种情况下,您根本不需要调用toString

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