の違いは何ですか文字列およびStringBuffer Java?
-
19-09-2019 - |
質問
の違いは何ですか文字列および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
は、それが作成されていますとき、それは変更することはできませんつまり、不変である。
StringBuffer
sの多くを構築するのパフォーマンス・オーバーヘッドなしに作品によって、文字列の部分を構築する必要がある場合、 StringBuilder
(またはその非同期いとこのString
)が使用されます。
これらはアレイとして内部的に格納されているため、両方の最大長は、Integer.MAX_VALUEであり、Java配列は、その長さの擬似フィールドのint
を有している。
複数の連結用String
sとStringBuffer
s間の性能の向上は非常に重要です。あなたは、次のテストコードを実行した場合、あなたは違いが表示されます。 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%、リストすることができる)可変であり、現在の一方の端部に文字列を追加することができます。
文字のスレッドセーフ、可変シーケンス。文字列バッファは、文字列のようなものであるが、変更することができます。任意の時点でそれが文字の一部の特定の配列を含むが、配列の長さと内容は特定のメソッドの呼び出しを介して変更することができます。
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オブジェクトは非常に高価なものとなります。
要約すると、線の上記コード生成の三つのオブジェクト:
- 文字列オブジェクトを位置0
- A StringBufferオブジェクト所在地10
- 文字列オブジェクトで場所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>
.
文字列は、文字列で操作を実行するとき、あなたが本当に全く新しい文字列を作成していることを意味し、不変である。
のStringBuffer に変更可能である、とあなたそれに追加並びに0にその長さをリセットすることができます。
実際には、コンパイラは、パフォーマンス上の理由から、文字列の連結の間にStringBufferを使用しているようです>。
String is immutable.
なぜ?ここをを確認します。
StringBuffer is not. It is thread safe.
のhref =「http://www.acquireandinspire.org/2013/01/string-string-builder-string-buffer.html」のrel <次に把握することができたし、他の概念を使用するときのようにさらに質問= "nofollowを">このを。
この情報がお役に立てば幸いです。
を理解していないとの主要な差別化要因に気付いた今日このStringBuffer(StringBuilder)ターネットサービスに興味深い方法で文字列は来ない。
- reverse()
- setCharAt()
その違いは
- のみ 文字列 クラス + オペレータが過負荷状態で運転されています。まconcat二つの文字列オブジェクトを使用 + オペレーターの場合 StringBuffer できません。
文字列 クラスは、オ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
文字列 クラスは、両 直列化可能 など 同, ものの、 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
を作成することができまStringオブジェクトな 新しい オペレーターがStringBufferオブジェクトで使用して作成し 新しい オペレーター
- Stringは不変なものStringBufferは可変です。
- StringBufferに同期され、文字列ainます。
- 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