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