4

サーバーに定期的にフラッシュする文字列を収集する StringBuilder を作成しています。フラッシュが失敗した場合は、次回再試行するために文字列を保持したいと思いますが、その間に、StringBuilder に追加する必要がある追加の文字列を送信する可能性があります。

私が知りたいのは、これを行うための最も効率的な方法です。これは、バッテリーの使用量と CPU の使用量が大きな懸念事項である Android アプリで行われているためです。StringBuilder の toString() 関数を呼び出すと、返された結果の文字列が内部的に保存されるため、後続の呼び出しで元の文字列をすべてコピーする必要がなくなりますか? または、呼び出しが失敗した場合、toString() からの戻り値で初期化された新しい StringBuilder を作成する必要がありますか?

4

3 に答える 3

5

OpenJDK ソース コードはStringBuilder次のとおりです。

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

これらのパラメーターを持つコンストラクターソースは次のとおりです。String

public String(char value[], int offset, int count) {
    if (offset < 0) {
        throw new StringIndexOutOfBoundsException(offset);
    }
    if (count < 0) {
        throw new StringIndexOutOfBoundsException(count);
    }
    // Note: offset or count might be near -1>>>1.
    if (offset > value.length - count) {
        throw new StringIndexOutOfBoundsException(offset + count);
    }
    this.offset = 0;
    this.count = count;
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}

はい、毎回新しいものを作成し、Stringはい、毎回のコピーを作成しますchar[]

これは の 1 つの実装でありtoString、別の実装は明らかに異なる場合があることに注意することが重要です。

于 2013-03-31T00:12:26.933 に答える
0

それは実装の詳細になります。Java 文字列は不変であるため、正しい impl は、必要がなくても StringBuilder.toString() から新しい文字列を共有または作成することを選択できます。

誰もが言うように、これが実際にパフォーマンスの問題であるかどうかをテストして確認できます。それが (不格好な) 回避策の 1 つである場合は、StringBuilder をラップして、結果の文字列をキャッシュすることです。ダーティ フラグを使用して、コンテンツが変更されたことを示すことができます。

于 2013-03-31T00:53:01.570 に答える