この説明が良かったので転送しました
Javaにはキャラクターの操作を担当するクラスが3つあります。
1.Character は単一の文字を操作し、
2.String は文字列を操作する、不変クラスです。
3.StringBuffer も文字列を操作し、変数クラスです。
String:
これはオブジェクトであり、プリミティブ型ではありません。
作成された値は変更できません。
既存の String オブジェクトを変更するには、新しいオブジェクトを再作成する必要があります。新しい値を追加すると、値が保存されます。
String は最終クラスです。つまり、
StringBuffer:
は変更されると、オブジェクトは再確立されません。文字列。
コンストラクターを通じてのみ作成できます。
StringBuffer sb = new StringBuffer();
注: オブジェクトが作成された後は、代入シンボルを通じて支払うことはできません。作成されると、メモリ空間がメモリに割り当てられ、最初に null が保存されます。 StringBuffer に値を割り当てるときは、その append() メソッドを使用できます。
sb.append("hello");
StringBuffer はより効率的です。文字列接続操作の文字列:
String str = new String("welcome to ");
str += "here";処理手順は、実際には StringBuffer を作成し、次に append() を呼び出し、最後に
次に StringBuffer を呼び出します。 toSting();
この場合、String StringBuffer の接続操作にはいくつかの追加操作が必要ですが、当然効率は損なわれます
そして String オブジェクトは不変オブジェクトであるため、Sting が操作されるたびに新しいオブジェクトが作成されます。新しい値を保存するために再確立されます。
次のコードを見てください:
String tempstr = "abcdefghijklmnopqrstuvwxyz"; int times = 5000; long lstart1 = System.currentTimeMillis(); String str = ""; for (int i = 0; i < times; i++) { str += tempstr; } long lend1 = System.currentTimeMillis(); long time = (lend1 - lstart1); System.out.println(time);残念ながら、私のコンピューターはスーパーコンピューターではないので、結果は毎回同じではない可能性がありますが、通常は 46687 程度です。
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 time2 = (lend2 - lstart2); System.out.println(time2);
結果は 16 ですが、場合によっては 0 になります
結論は明らかで、StringBuffer は String よりもほぼ数万倍高速です。もちろん、このデータはあまり正確ではありません。サイクル数が 100,000 回になると、その差はさらに大きくなるからです。私の言うことが信じられないなら、試してみてください
それでも理解できない場合:
1) String の Union + メソッドと StringBuff の append メソッドの違い:
String の + 演算子は、まず現在の文字列を追加します。オブジェクトを StringBuff 型に変換し、その append メソッドを呼び出し、最後に生成された StringBuff オブジェクトを toString メソッドで String 型の文字列に変換するため、効率が悪くなります。
しかし、読みやすさという点では、String の接続演算子の方がまだ優れています。
2) StringBuff はスレッドセーフです
String はスレッドアンセーフです
3) String は変更できない文字列オブジェクトですが、StringBuff は変更できます。
public static boolean fileCopy(String srcStr, String destStr) { File srcFile = null; File destFile = null; Reader reader = null; Writer writer = null; boolean flag = false; try { srcFile = new File(srcStr); if (!srcFile.exists()) { System.out.println(“源文件不存在”); System.exit(0); } else { reader = new FileReader(srcFile); } destFile = new File(destStr); writer = new FileWriter(destFile); char[] buff = new char[1024]; int len; String 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()); } return flag; }
JAVA の StringBuffer と String の違いの分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。