この説明が良いので、私はそれを好転させます
Javaには、キャラクター操作を担当する3つのクラスがあります。
1。文字は単一の文字操作です。
2.ストリングは、一連の文字列、不変のクラスで動作します。
3.StringBufferは、文字列の操作でもあり、可変クラスです。
弦:
それは原始タイプではなくオブジェクトです。
それは不変のオブジェクトであり、作成されると、その値を変更することはできません。
既存の文字列オブジェクトの変更は、新しいオブジェクトを再作成し、新しい値を保存することです。
文字列は最終クラスです。つまり、継承することはできません。
stringbuffer:
これは、変更可能なオブジェクトです。
コンストラクターによってのみ作成できます。
stringbuffer sb = new StringBuffer();
注:割り当て記号では支払うことはできません。
sb = "ここにようこそ!"; //エラー
オブジェクトが作成されると、メモリスペースがメモリに割り当てられ、最初にnullがStringBufferに割り当てられる場合、Append()メソッドを使用することができます。
sb.append( "hello");
StringBufferの効率は、文字列の連結の文字列の効率よりも高くなっています。
string str = new String( "Welcome to");
str += "here";
処理ステップは、実際にはstringbufferを作成し、append()を呼び出し、最後に
次に、stringbuffer tosting()を追加します。
このようにして、String接続操作にはStringBufferよりも追加の操作があり、もちろん効率が低下します。
また、文字列オブジェクトは不変のオブジェクトであるため、STINGの各操作は新しいオブジェクトを再現して新しい値を保存します。
このようにして、元のオブジェクトは役に立たず、これはパフォーマンスにも影響します。
次のコードを見てください。
26個の英語の手紙を5,000回繰り返します。
コードコピーは次のとおりです。
string tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1 = system.currenttimemillis();
文字列str = "";
for(int i = 0; i <times; i ++){
str += tempstr;
}
long lend1 = system.currenttimemillis();
long time =(lend1 -lstart1);
System.out.println(time);
残念ながら、私のコンピューターはスーパーコンピューターではなく、私が得た結果は必ずしも毎回同じではなく、通常は46687前後です。
それは46秒です。
次のコードを見てみましょう
コードコピーは次のとおりです。
string tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = system.currenttimemillis();
stringbuffer sb = new StringBuffer();
for(int i = 0; i <times; i ++){
sb.append(tempstr);
}
long lend2 = system.currenttimemillis();
long thigh2 =(lend2 -lstart2);
System.out.println(time2);
結果は16で、時には0です
したがって、結論は明らかです。StringBufferの速度は、弦のほぼ数万倍です。もちろん、このデータはあまり正確ではありません。サイクルの数は100,000倍であるため、差はさらに大きくなります。あなたが私を信じていないなら、試してみてください
まだ理解できない場合:
1)文字列のジョイント +メソッドとstringbuffの付録方法の違い:
文字列 +演算子が文字列操作を実行すると、最初に現在の文字列オブジェクトをStringBuffタイプに変換し、その追加方法を呼び出し、最後に生成されたStringBuffオブジェクトをToStringメソッドを介してString型文字列に変換するため、非効率的です。
ただし、読みやすさの点では、文字列の接続演算子はまだ高いです。
2)StringBuffはスレッドセーフです
文字列はスレッドの非安全です
3)文字列は、変更できない文字列オブジェクトであり、StringBuffが変更されます。
コードコピーは次のとおりです。
public static boolean filecopy(string srcstr、string deststr){
ファイルsrcfile = null;
ファイルdestfile = null;
Reader reader = null;
ライターライター= null;
ブールフラグ= false;
試す {
srcfile = new file(srcstr);
if(!srcfile.exists()){
system.out.println( "ソースファイルは存在しません");
System.Exit(0);
} それ以外 {
reader = new fileReader(srcfile);
}
destfile = new file(deststr);
writer = new filewriter(destfile);
char [] buff = new char [1024];
int len;
文字列str = "";
stringbuffer sbuff = new StringBuffer();
while((len = reader.read(buff))!= -1){
// str += new String(buff、0、len);
sbuff.append(new String(buff、0、len));
}
// writer.write(str.tochararray());
writer.write(sbuff.tostring()。tochararray());
flag = true;
writer.flush();
reader.close();
writer.close();
} catch(ioException e){
System.out.println( "ファイルコピー例外:=" + e.getMessage());
}
フラグを返します。
}