質問

の違いは何ですか文字列およびStringBuffer Java?

はりの最大サイズん。

役に立ちましたか?

解決

String 用の操作文字列を変更できません(読み出し専用(read-only)と読み書不変なため).

StringBuffer での表示に使用する文字が可能です。

性能的に StringBuffer より速やかにconcatenations.これには大きな違いがあったと思い連結し String, す新しいオブジェクトを作成(内部)以 String は変更できません。

も利用できます StringBuilder その StringBuffer それ以外は同期化されません。最大サイズのためこれらは Integer.MAX_VALUE (231 -1=2,147,483,647)または最大ヒープサイズに分割による2参照 どのように多くの文字がJavaのStringのですか?).詳細情報 こちらの.

他のヒント

Stringは、それが作成されていますとき、それは変更することはできませんつまり、不変である。

あなたが道に沿って少しStringBuffersの多くを構築するのパフォーマンス・オーバーヘッドなしに作品によって、文字列の部分を構築する必要がある場合、

StringBuilder(またはその非同期いとこのString)が使用されます。

これらはアレイとして内部的に格納されているため、両方の最大長は、Integer.MAX_VALUEであり、Java配列は、その長さの擬似フィールドのintを有している。

複数の連結用StringsとStringBuffers間の性能の向上は非常に重要です。あなたは、次のテストコードを実行した場合、あなたは違いが表示されます。 Java 6のと私の古代のラップトップ上で、私はこれらの結果を得る:

Concat with String took: 1781ms
Concat with StringBuffer took: 0ms
public class Concat
{
    public static String concatWithString()
    {
        String t = "Cat";
        for (int i=0; i<10000; i++)
        {
            t = t + "Dog";
        }
        return t;
    }
    public static String concatWithStringBuffer()
    {
        StringBuffer sb = new StringBuffer("Cat");
        for (int i=0; i<10000; i++)
        {
            sb.append("Dog");
        }
        return sb.toString();
    }
    public static void main(String[] args)
    {
        long start = System.currentTimeMillis();
        concatWithString();
        System.out.println("Concat with String took: " + (System.currentTimeMillis() - start) + "ms");
        start = System.currentTimeMillis();
        concatWithStringBuffer();
        System.out.println("Concat with StringBuffer took: " + (System.currentTimeMillis() - start) + "ms");
    }
}
String                                          StringBuffer

Immutable                                       Mutable
String s=new String("karthik");                StringBuffer sb=new StringBuffer("karthik")
s.concat("reddy");                             sb.append("reddy");
System.out.println(s);                         System.out.println(sb);
O/P:karthik                                    O/P:karthikreddy

--->once we created a String object            ---->once we created a StringBuffer object
we can't perform any changes in the existing  we can perform any changes in the existing
object.If we are trying to perform any        object.It is nothing but mutablity of 
changes with those changes a new object       of a StrongBuffer object
will be created.It is nothing but Immutability
of a String object

Use String--->If you require immutabilty
Use StringBuffer---->If you require mutable + threadsafety
Use StringBuilder--->If you require mutable + with out threadsafety

String s=new String("karthik");
--->here 2 objects will be created one is heap and the other is in stringconstantpool(scp) and s is always pointing to heap object

String s="karthik"; 
--->In this case only one object will be created in scp and s is always pointing to that object only

文字列は不変クラスです。これは、あなたがそのような文字列のインスタンスをインスタンス化したら、ということを意味します:

String str1 = "hello";

メモリ内のオブジェクトを変更することはできません。代わりに、あなたは、新しいインスタンスを作成し、古い文字列をコピーして追加する必要があります。この例のように任意の他ます:

String str1 = "hello";
str1 = str1 + " world!";

本当に聞く起こっていることは...私たちは、すべて一緒に新しいメモリを再割り当て「ハロー」のデータをコピーして追加されている私たちは、既存のSTR1オブジェクトを更新していないことである「世界を!」最後に、この新しいメモリを指すようにSTR1参照を設定。だから、本当にフードの下より、次のようになります:

String str1 = "hello";
String str2 = str1 + " world!";
str1 = str2;

それはrepitively特に再帰的に行われていれば、この「コピー+ペーストしてメモリに周りのものを移動する」プロセスは非常に高価なことができることを次のようにします。

あなたは以上のことを行うとオーバーのStringBuilderを利用することのような状況にある場合。それはバック【成長アレイ]でだから(すなわち、実際のデータ構造でない場合は100%、リストすることができる)可変であり、現在の一方の端部に文字列を追加することができます。

APIから:

  

文字のスレッドセーフ、可変シーケンス。文字列バッファは、文字列のようなものであるが、変更することができます。任意の時点でそれが文字の一部の特定の配列を含むが、配列の長さと内容は特定のメソッドの呼び出しを介して変更することができます。

AのStringBufferは、例えば、多くの文字列から単一の文字列を作成するために使用されあなたは、ループ内の文字列の部分を追加したいときます。

あなたがたStringBufferにアクセスするだけで、単一のスレッドがある場合のStringBuilderが速いので、同期していないので、

あなたは、代わりにStringBufferのStringBuilderのを使用する必要があります。

が文字列のサイズには上限は言語としてJavaではありませんが、JVMは、おそらく上限を持っています。

私の知る限り

この利回答の性能比較し文字列vs StringBufferによるレジー Hutcherso : http://www.javaworld.com/javaworld/jw-03-2000/jw-0324-javaperf.html

JavaのStringBufferと文字列のクラスの文字列のクラスを使用する操作文字列を変更することはできません。一言で表現するならば、オブジェのタイプ文字列読み込み、変更できません。のStringBufferのクラスを表すために使用できる文字を修正しました。

に顕著なパフォーマンスの違いこれらの二つのクラスはこのStringBufferにより、プレス文字列が簡便なインターフェイスconcatenations.文字列操作コード文字列は日常的に連結され.使用文字列のクラスは、concatenationsは、通常、次のように行ってい:

 String str = new String ("Stanford  ");
 str += "Lost!!";

用した場合はStringBufferて連結するコードは以下のようなものです:

 StringBuffer str = new StringBuffer ("Stanford ");
 str.append("Lost!!");

開発者は、通常は最初の記の例では、より効率がいいから何とかなると思っている次の例は、使用の追加方法を連結した、より費用のかかる最初の例は、使用のオペレーターを連結二つの文字列オブジェクト。

のオペレーターが表示され罪のないものの、生成されたコードを生驚くことで生きています。用StringBufferのために連結実際には生産コードで大幅に高速を使用し文字列です。の発掘、なぜこの場合のよいあり方を検討する必要があ電bytecodeからの二つの例です。のbytecodeの例を文字列は以下のようなものです:

0 new #7 <Class java.lang.String>
3 dup 
4 ldc #2 <String "Stanford ">
6 invokespecial #12 <Method java.lang.String(java.lang.String)>
9 astore_1
10 new #8 <Class java.lang.StringBuffer>
13 dup
14 aload_1
15 invokestatic #23 <Method java.lang.String valueOf(java.lang.Object)>
18 invokespecial #13 <Method java.lang.StringBuffer(java.lang.String)>
21 ldc #1 <String "Lost!!">
23 invokevirtual #15 <Method java.lang.StringBuffer append(java.lang.String)>
26 invokevirtual #22 <Method java.lang.String toString()>
29 astore_1

のbytecode拠点について0-9の実行のための最初の行のコードするには、こちら

 String str = new String("Stanford ");

その後、bytecode所10-29日に実行される連結:

 str += "Lost!!";

くの興味深い。のbytecode生の連結を作成しStringBufferのオブジェクトを呼び出し、その追加方法:仮StringBufferオブジェクトの作成ロケーションでの10は、appendメソッドが呼びロケーションでの23.では、Stringクラスは不変なので、StringBufferを使用する必要があ連結した.

後の連結について興味があるというStringBufferオブジェクトで変換が必要な文字列になります。を有することが期待されているのtoStringメソッドロケーションでの26.この方法を新たに生成しますStringオブジェクトからの仮StringBufferオブジェクトです。この仮StringBufferオブジェクトとその後の変換に戻すStringオブジェクトは非常に高価なものとなります。

要約すると、線の上記コード生成の三つのオブジェクト:

  1. 文字列オブジェクトを位置0
  2. A StringBufferオブジェクト所在地10
  3. 文字列オブジェクトで場所26

現在見られるようにbytecode発生するための例を用いStringBuffer:

0 new #8 <Class java.lang.StringBuffer>
3 dup
4 ldc #2 <String "Stanford ">
6 invokespecial #13 <Method java.lang.StringBuffer(java.lang.String)>
9 astore_1
10 aload_1 
11 ldc #1 <String "Lost!!">
13 invokevirtual #15 <Method java.lang.StringBuffer append(java.lang.String)>
16 pop

のbytecode拠点について0-9の実行のための最初の行のコード:

 StringBuffer str = new StringBuffer("Stanford ");

のbytecode所10-16はその実行の連結:

 str.append("Lost!!");

この場合のように、最初の例では、このコードを呼び出しの追加方法のStringBufferオブジェクトです。とは異なり、最初の例では、しかしながら、必要な時のStringBufferしに変換する文字列オブジェクトです。このコードを一つだけのオブジェクトのStringBufferに、位置0になります。

結論としては、StringBufferを連結したすく文字列を連結した.明らかに、StringBuffers使用する必要があるこの型の操作が可能です。場合、機能文字列のクラスを希望するものは、使用を考慮してStringBufferのための連結および一への変換文字列になります。

また、証明任意の追加操作の後に文字列/ StringBufferオブジェクトのハッシュコードを印刷することにより、Stringオブジェクトではなく、同じStringオブジェクトを使用するよりも、新しい値を内部的にするたびに再作成取得されます。

public class MutableImmutable {

/**
 * @param args
 */
public static void main(String[] args) {
    System.out.println("String is immutable");
    String s = "test";
    System.out.println(s+"::"+s.hashCode());
    for (int i = 0; i < 10; i++) {
        s += "tre";
        System.out.println(s+"::"+s.hashCode());
    }

    System.out.println("String Buffer is mutable");

    StringBuffer strBuf = new StringBuffer("test");
    System.out.println(strBuf+"::"+strBuf.hashCode());
    for (int i = 0; i < 10; i++) {
        strBuf.append("tre");
        System.out.println(strBuf+"::"+strBuf.hashCode());
    }

 }

}

出力: それは、そのハッシュコードとともにオブジェクト値を印刷

    String is immutable
    test::3556498
    testtre::-1422435371
    testtretre::-1624680014
    testtretretre::-855723339
    testtretretretre::2071992018
    testtretretretretre::-555654763
    testtretretretretretre::-706970638
    testtretretretretretretre::1157458037
    testtretretretretretretretre::1835043090
    testtretretretretretretretretre::1425065813
    testtretretretretretretretretretre::-1615970766
    String Buffer is mutable
    test::28117098
    testtre::28117098
    testtretre::28117098
    testtretretre::28117098
    testtretretretre::28117098
    testtretretretretre::28117098
    testtretretretretretre::28117098
    testtretretretretretretre::28117098
    testtretretretretretretretre::28117098
    testtretretretretretretretretre::28117098
    testtretretretretretretretretretre::28117098

A StringBuffer 又はその代高速兄弟 StringBuilder が好きんいろの文字列concatenations趣の

string += newString;

または同様に

string = string + newString;

で上記を構築しますが暗黙的に作成 新しい 文字列に見る大きな性能のドロップします。A StringBuffer / StringBuilder 以下のフードベストの比較がなされなければならない、動的にexpansible List<Character>.

A String は変更不能な文字の配列になります。

A StringBuffer は変更可能な文字の配列になります。しばしばへの変換 String うひとつのメカニズム.

いずれの配列の最大サイズの両方が等しい、最大サイズの整数2^31-1参照 JavaDoc, ものJavaDocの両方 StringStringBuffer).これは、 .length 引数の配列はプリミティブ int.参照 配列).

文字列は、文字列で操作を実行するとき、あなたが本当に全く新しい文字列を作成していることを意味し、不変である。

のStringBuffer に変更可能である、とあなたそれに追加並びに0にその長さをリセットすることができます。

実際には、コンパイラは、パフォーマンス上の理由から、文字列の連結の間にStringBufferを使用しているようです。

を理解していないとの主要な差別化要因に気付いた今日このStringBuffer(StringBuilder)ターネットサービスに興味深い方法で文字列は来ない。

  • reverse()
  • setCharAt()

その違いは

  1. のみ 文字列 クラス + オペレータが過負荷状態で運転されています。まconcat二つの文字列オブジェクトを使用 + オペレーターの場合 StringBuffer できません。
  2. 文字列 クラスは、オtoString()、equals(),hashCode()の オブジェクト ラックス StringBuffer のみをオーバーライドtoString().

    String s1 = new String("abc");
    String s2 = new String("abc");
    System.out.println(s1.equals(s2));  // output true
    
    StringBuffer sb1 = new StringBuffer("abc");
    StringBuffer sb2 = new StringBuffer("abc");
    System.out.println(sb1.equals(sb2));  // output false
    
  3. 文字列 クラスは、両 直列化可能 など , ものの、 StringBuffer直列化可能.

    Set<StringBuffer> set = new TreeSet<StringBuffer>();
    set.add(sb1);
    set.add(sb2);
    System.out.println(set);  // gives ClassCastException because there is no Comparison mechanism
    
  4. を作成することができまStringオブジェクトな 新しい オペレーターがStringBufferオブジェクトで使用して作成し 新しい オペレーター

  5. Stringは不変なものStringBufferは可変です。
  6. StringBufferに同期され、文字列ainます。
  7. StringBufferを内蔵 reverse() 方法では文字列同線なっています。

性能的にStringBufferにあり文字列;でき申請を連結したStringオブジェクトを新しい文字列オブジェクトが作成され、各連結した.

主ルールに関連付けます: Stringは不変なので不変更可能)およびStringBufferは変更可能(変更可能)

こちらのプ実験での性能差

public class Test {

  public static int LOOP_ITERATION= 100000;

  public static void stringTest(){
    long startTime = System.currentTimeMillis();
    String string = "This";
    for(int i=0;i<LOOP_ITERATION;i++){
        string = string+"Yasir";
    }

    long endTime = System.currentTimeMillis();
    System.out.println(endTime - startTime);    
  }

  public static void stringBufferTest(){
    long startTime = System.currentTimeMillis();
    StringBuffer stringBuffer = new StringBuffer("This");
    for(int i=0;i<LOOP_ITERATION;i++){
        stringBuffer.append("Yasir");
    }

    long endTime = System.currentTimeMillis();
    System.out.println(endTime - startTime);
  }

  public static void main(String []args){
    stringTest()
    stringBufferTest(); 
  }
 }

出力文字列は私の機 14800

出力のStringBufferとも、機械 14

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top