1

アプリのパフォーマンスの改善に取り組んでいます。次のうちどれがより多くのメモリを使用するかについて混乱しています: ここで sb はStringBuffer

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

また

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

6 に答える 6

3

メモリに関しては、次のような式

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

文字列は評価直後にガベージ コレクションされるため、影響はほとんどまたはまったくありません。(一時的なメモリの使用を避けるために、私はすることをお勧めします

sb.indexOf("+")

代わりに。)

ただし、を使用すると、リークが発生する可能性がありますString.substring。前回チェックしたときは、基本的に元の文字列のビューsubstringを返すため、元の文字列はまだメモリに常駐しています。

回避策は

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

必要な文字列を元の (潜在的に大きい) 文字列から切り離します。String.splitここで説明したのと同じことが当てはまります。

于 2012-06-13T08:32:18.500 に答える
2

StringBuilder#toString()2つ目は、を呼び出すたびに新しいStringインスタンスが作成されるため、より多くのメモリを使用します。

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

于 2012-06-13T08:31:22.667 に答える
2

分析

StringBuilder の OpenJDK ソースを見ると、次のようになります。

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 の同じインスタンスが取得されます。

于 2012-06-13T08:33:59.297 に答える
1

新しいオブジェクトを作成すると、常により多くのメモリが消費されます。ただし、あなたの場合、違いは重要ではないようです。

また、あなたの場合、ヒープスペースをとるローカル変数を作成しています。

メソッド内の複数の場所に参照がある場合は 、どこでもString strWithLink = sb.toString();同じものを使用できるため、を使用することをお勧めします。strWithLinkそれ以外の場合、参照が1つしかない場合は、sb.toString();直接使用する方が常に適切です。


于 2012-06-13T08:31:14.447 に答える
1

他の人の回答を確認してください。2番目の回答はもう少しメモリを消費しますが、これは最適化しすぎているように聞こえます。コードを明確で読みやすい状態に保つことが最優先事項です。読みやすさが損なわれる場合は、そのような小さな最適化についてあまり心配しないことをお勧めします。

于 2012-06-13T08:33:46.893 に答える
1

行う作業が少ないほど、通常は効率的です。この場合、toString を呼び出す必要はまったくありません。

clickHereTextview.setText(Html.fromHtml(sb.substring(0, sb.indexOf("+"))));
于 2012-06-13T08:36:43.557 に答える