ホームページ  >  記事  >  Java  >  JAVAにおけるStringBufferとStringの違いの分析

JAVAにおけるStringBufferとStringの違いの分析

高洛峰
高洛峰オリジナル
2017-01-22 09:36:141424ブラウズ

この説明が良かったので転送しました

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 が操作されるたびに新しいオブジェクトが作成されます。新しい値を保存するために再確立されます。

このようにすると、元のオブジェクトは役に立たなくなり、ガベージ コレクションされます。


次のコードを見てください:

26 個の英語文字を 5000 回追加しました。 、

        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 程度です。
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 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 サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。