JavaにおけるStringとStringBufferの違い

3561 ワード

StringとStringBufferの違いは、ネット上の資料では数え切れないほどありますが、この文章を見ると、中で作った小さな例が代表的だと感じたので、回って、自分でまとめました.
Javaには3つのクラスが文字の操作を担当しています.
1.Characterは1文字の操作を行い、
2.Stringは一連の文字を操作します.可変クラス.
3.StringBufferも一連の文字を操作しますが、可変クラスです.
String:
オブジェクトが元のタイプではありません.
可変オブジェクトとして作成すると、その値を変更することはできません.
既存のStringオブジェクトに対する修正は、新しいオブジェクトを再作成し、新しい値を保存することです.
Stringはfinalクラス、すなわち継承できない.
StringBuffer:
可変オブジェクトです.Stringのようにオブジェクトを再構築することはありません.
コンストラクション関数でしか作成できません
StringBuffer sb = new StringBuffer();
note:付値記号で彼に付値することはできない.
sb = "welcome to here!";//error
オブジェクトが作成されると、メモリにメモリ領域が割り当てられ、null.がStringBufferに最初に保存されます.
中付値の場合はappendメソッドを使用できます.
sb.append("hello");
StringBufferの効率はStringよりも高い文字列接続操作です.
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の万倍です.もちろんこのデータは正確ではありません.サイクルの回数が100000回のとき、差がもっと大きいからです.信じないでやってみてください.
上記のように、
str += "here";
実際にはStringBufferを作成してappend()を呼び出し、最後に
StringBuffer toSting();
したがってstr+=「here」であり、
StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();
したがって、Stringを直接「+」で接続するコードは、基本的に以下のコードと同等であることができる.
            String tempstr = "abcdefghijklmnopqrstuvwxyz";
            int times = 5000;
            long lstart2 = System.currentTimeMillis();
            String str = "";
            for (int i = 0; i < times; i++) {
                StringBuffer sb = new StringBuffer(str);
                sb.append(tempstr);
                str = sb.toString();
            }
            long lend2 = System.currentTimeMillis();
            long time2 = (lend2 - lstart2);
            System.out.println(time2);

平均実行時間は46922程度、つまり46秒である.
まとめ:プログラムで文字列を頻繁に修正する必要がある場合は.StringBufferを使用するとパフォーマンスが向上します.
記事の出典:
http://blog.csdn.net/yirentianran/article/details/2871417