web-dev-qa-db-ja.com

StringがあるときにStringBuilderを使用する理由

初めてStringBuilderに出会ったばかりで、Javaには追加できる非常に強力なStringクラスがあるため、驚いた。

なぜ2番目のStringクラスなのですか?

StringBuilderの詳細はどこで入手できますか?

74
an00b

Stringは追加を許可しません。 Stringで呼び出す各メソッドは、新しいオブジェクトを作成して返します。これは、Stringが不変であるためです-内部状態を変更できません。

一方、StringBuilderは可変です。 append(..)を呼び出すと、新しい文字列オブジェクトを作成するのではなく、内部のchar配列を変更します。

したがって、以下の方が効率的です。

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
    sb.append(i);
}

のではなく str += iは、500個の新しい文字列オブジェクトを作成します。

この例ではループを使用していることに注意してください。 heliosがコメントで述べているように、コンパイラはString d = a + b + cのようなものに

String d = new StringBuilder(a).append(b).append(c).toString();

StringBufferに加えてStringBuilderがあることにも注意してください。違いは、前者には同期化されたメソッドがあることです。ローカル変数として使用する場合は、StringBuilderを使用します。複数のスレッドからアクセスされる可能性がある場合は、StringBufferを使用します(これはまれです)

156
Bozho

理由の具体例を次に示します-

int total = 50000;
String s = ""; 
for (int i = 0; i < total; i++) { s += String.valueOf(i); } 
// 4828ms

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); } 
// 4ms

ご覧のとおり、パフォーマンスの違いは重要です。

56
Amir Raminfar

StringBuilderは不変ですが、Stringクラスは不変です。

String s = "Hello";
s = s + "World";

上記のコードは、文字列が不変であるため2つのオブジェクトを作成します

StringBuilder sb = new StringBuilder("Hello");
sb.append("World");

StringBuilderは不変ではないため、上記のコードは1つのオブジェクトのみを作成します。

レッスン:Stringを何度も操作/更新/追加する必要がある場合は常に、StringBuilderと比べてStringBuilderの方が効率的です。

18
u449355

StringBuilderは、文字列を作成するためのものです。具体的には、非常にパフォーマンスの高い方法でそれらを構築します。 Stringクラスは多くのことに役立ちますが、実際には、新しい文字列はまったく新しい、再割り当てされた文字列であるため、小さな文字列部分から新しい文字列を組み立てるときに本当にひどいパフォーマンスを発揮します。 (不変)StringBuilderは同じシーケンスをインプレースに保持し、変更します( mutable)。

8
Rex M

StringBuilderクラスは可変であり、Stringとは異なり、Stringオブジェクトを作成することなく文字列の内容を変更できます。これにより、文字列を大幅に変更する場合のパフォーマンスが向上します。また、StringBufferと呼ばれるStringBuilderに対応するものもあります。これも同期されるため、マルチスレッド環境に最適です。

Stringの最大の問題は、Stringを使用した操作では、常に新しいオブジェクトが返されることです。

String s1 = "something";
String s2 = "else";
String s3 = s1 + s2; // this is creating a new object.
4
CarlosZ

効率。

文字列を連結するたびに、新しい文字列が作成されます。例えば:

String out = "a" + "b" + "c";

これにより、新しい一時的な文字列が作成され、「a」と「b」がコピーされて「ab」が生成されます。次に、別の新しい一時文字列を作成し、「ab」と「c」をコピーして「abc」を生成します。この結果は、outに割り当てられます。

結果は 画家のシュレミエルアルゴリズム O(n²)(2次)時間の複雑さです。

一方、StringBuilderでは、必要に応じて出力文字列のサイズを変更し、文字列をその場で追加できます。

3
Thomas

StringBuilderは、大きな文字列を扱う場合に適しています。パフォーマンスの改善に役立ちます。

ここに 記事 があります。

簡単なグーグル検索があなたを助けたかもしれません。今、あなたはあなたのためにグーグル検索をするために7人の異なる人を雇った。 :)

正確には、すべての文字列を追加するStringBuilderはO(N)で、Stringを追加するのはO(N ^ 2)です。ソースコードをチェックすると、これは文字の可変配列を保持することによって内部的に達成されます。 StringBuilderは、配列長の複製手法を使用してammortized O(N ^ 2)のパフォーマンスを達成しますが、必要なメモリを潜在的に2倍にしますが、最後にtrimToSizeを呼び出してこれを解決できますが、通常はStringBuilderオブジェクト最終的な文字列サイズで適切な開始推測を提供することにより、パフォーマンスをさらに向上させることができます。

2
mahogny

Javaには、String、StringBuffer、およびStringBuilderがあります。

  • 文字列:その不変

  • StringBuffer:その可変およびスレッドセーフ

  • StringBuilder:可変であるがThreadSafeではない、Java 1.5で導入

文字列例:

public class T1 {

    public static void main(String[] args){

        String s = "Hello";

        for (int i=0;i<10;i++) {

            s = s+"a";
            System.out.println(s);
        }
    }
}

}

出力:1つのストリングではなく、10の異なるストリングが作成されます。

Helloa
Helloaa
Helloaaa
Helloaaaa
Helloaaaaa
Helloaaaaaa
Helloaaaaaaa
Helloaaaaaaaa 
Helloaaaaaaaaa 
Helloaaaaaaaaaa

StringBuilder例:1つのStringBuilderオブジェクトのみが作成されます。

public class T1 {

    public static void main(String[] args){

        StringBuilder s = new StringBuilder("Hello");

        for (int i=0;i<10;i++) {    
            s.append("a");
            System.out.println(s);
        }
    }
}
1

StringとStringBuilderの両方はJavaのクラスですが、違いはStringBuildersが変更可能であるのに対してStringsは不変です。Stringが提供しない特定の操作があります。 StringBuilderメソッドはありますが、StringBuilderメソッドは次のとおりです。

StringでStringBuilderメソッドを使用するには、StringBuilderコンストラクターに引数としてStringを渡す必要があり、StringBuilderインスタンスを作成します

String s = "Your String"; 
StringBuilder sb = new StringBuilder(s); 

次に、StringBuilderインスタンスsbで次のStringBuilderメソッドを使用できます

enter image description here

0
CoderSam