ホームページ > Java > &#&チュートリアル > JAVAにおけるStringBufferとStringの違いの分析

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

高洛峰
リリース: 2017-01-22 09:36:14
オリジナル
1573 人が閲覧しました

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

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 回追加しました。 、

1

2

3

4

5

6

7

8

9

10

        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秒です。
もう一度次のコードを見てみましょう

1

2

3

4

5

6

7

8

9

10

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 は変更できます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート