String、StrigBurer、StrigBuiderの違い


転載元:http://www.cnblogs.com/liuyhaiying/articles/945419.html
Stringは変更不可で、固定長である。StringBufferは、StringBuiderが長いかもしれませんが、変更できます。      注意:StringBuiderとStrigBufferのequals方法は二つの文字列の内容が同じかどうかを比較できると思っていましたが、今日はそうではないことに気づきました。これらの2つのクラスはObjectから直接継承され、equals法を書き換えることができませんでした。
StringBuilder sb1 = new StringBuilder("123"); 
StringBuilder sb2 = new StringBuilder("123"); System.out.println(sb1.equals(sb2));
     :false
 
  内容が同じかどうかを比較するなら、sb 1.toString().equals(sb 2.toString()
 
  簡単に言えば、StringタイプとStrigBufferタイプの主な性能の違いは、Stringは可変的ではないオブジェクトであるため、Stringタイプを変更するたびに、新しいStringオブジェクトを生成し、新しいStringオブジェクトにポインタを向けるのと同じです。生成対象はシステム性能に影響を与えるので、特にメモリに引用対象がないとJVMのGCが動作し始めます。その速度はかなり遅くなります。       StringBufferクラスを使用すると結果が違ってきます。その都度、結果としてStringBufferオブジェクト自体を操作します。新しいオブジェクトを生成するのではなく、オブジェクト参照を変更します。したがって、一般的には、SteringBuffer、特に文字列オブジェクトがよく変わる場合をおすすめします。いくつかの特別な場合には、Stringオブジェクトの文字列スティッチングはJVMによってStringBufferオブジェクトのスティッチングと解釈されているので、これらの場合はStringオブジェクトの速度はString Bufferオブジェクトよりも遅くはないが、特に以下の文字列オブジェクトの生成においては、String効率はString Bufferよりも遥かに速い:
String S1 = “This is only a” + “ simple” + “ test”; 
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);  
 
   驚くべきことに、String S 1のオブジェクトが生成される速度は速すぎます。この時、StringBufferは上根本のスピードに全く優位を占めていません。実はこれはJVMのトリックです。JVMの目には、これが
 String S 1=「This is only a」+「simple」+「test」つまり: String S 1=「This is only a simple test」だから、もちろんあまり時間はいらないです。ただし、ここで注意したいのは、他のStringオブジェクトから文字列が来たら、速度はそんなに速くないということです。例えば、
 
String S2 = “This is only a”; 
String S3 = “ simple”; 
String S4 = “ test”; 
String S1 = S2 +S3 + S4;  
 
この時はJVMはちゃんと元のやり方でやります。
ほとんどの場合、SteringBuffer>String StringBurer Java.lang.StrigBurerスレッドの安全な可変文字シーケンス。Stringに似た文字列バッファがありますが、変更はできません。任意の時点では特定の文字列が含まれていますが、いくつかの方法で呼び出して、シーケンスの長さと内容を変更することができます。文字列バッファを複数のスレッドに安全に使用できます。これらの方法は必要に応じて同期され得るので、任意の特定の例における全ての動作は、関連する各スレッドによる方法の呼び出し順序と一致するシリアル順序で発生するように思われる。StringBufferでの主な操作は、appedとinsert方法であり、これらの方法を再ロードして、任意の種類のデータを受け入れることができる。各方法は、与えられたデータを文字列に変換し、文字列の文字を文字列バッファに追加または挿入することができます。appedメソッドは常にこれらの文字をバッファの端に追加します。insertメソッドは、指定されたポイントに文字を追加します。    例えば、zが現在の内容を「start」という文字列バッファオブジェクトを引用すると、この方法でZ.apped(le)を呼び出して文字列バッファに「startle」が含まれ、z.insert(4,le)は文字列バッファ領域を変更し、「starlet」を含むようにします。ほとんどの場合、StringBuider>StringBuffer
java.lang.StringBuiilde java.lang.StringBuiderの可変文字列は5.0に追加されました。このようなアプリケーションは、StringBufferと互換性のあるAPIを提供するが、同期は保証されていない。このクラスはStringBufferの簡易交換として設計され、文字列バッファ領域で単一スレッドに使用される場合に使用される(この場合は一般的である)。もし可能であれば、このクラスを優先的に採用することを提案します。ほとんどの実装では、SteringBufferよりも速いです。両者の方法は基本的に同じである。
非公式試験により、StringBuiderとStrigBufferのテスト概要は以下の通りです。
1.  より良い性能を得るためには、StirngBufferまたはStirngBuiderを構築する際に、できるだけその容量を指定しなければならない。もちろん、操作する文字列の長さが16文字を超えないなら大丈夫です。
2.  同じ場合にはStirngBuiderを使うよりも、StringBufferを使うと10%~15%程度の性能が向上しますが、マルチスレッドの危険性があります。現実的なモジュール化プログラムでは、あるモジュールを担当するプログラマは、必ずしもこのモジュールがマルチスレッドに入る環境で動作するかどうかを明確に判断できるわけではないので、あなたのシステムのボトルネックがStringBuffer上にあると確定できない限り、マルチスレッドモードでモジュールが実行されないことを確認します。
3.  既存のクラスをうまく使うことは、新しいクラスを導入することよりも重要です。多くのプログラマがStringBurerを使用する時は容量を指定しないです。(少なくとも私が見た場合はそうです。)このような習慣がStringBuiderの使用に持ち込んだら、あなたは10%ぐらいの性能向上しか得られません。指定された容量のStringBurerを使うと、すぐに45%ぐらいの性能が上がります。指定された容量を使わないStirngBuiderよりも30%ぐらい早いです。