JAVAのString三兄弟


Javaプログラムを作成する際には、いくつかの文字列をつなぎ合わせる必要があります.以前は「+」でつなぎ合わせることがよくありましたが、Javaではこのようなつなぎ合わせ方法を直接使用すると、String型のオブジェクトが多く作成され、システムはString型のオブジェクトが多すぎるため、サーバオブジェクトとシステムのパフォーマンスに大きな影響を与えます.したがって、JavaにはStringBufferまたはStringBuilderを使用するより良い文字列の結合方法があります.
一、StringとStringBuffer
◎ String:可変クラスであり、Stringの変更によって新しいStringオブジェクトが生成されます.
    Stringを使用して2つの文字列をつなぎ合わせると、次のコードを実行できます.
<span style="font-family:FangSong_GB2312;font-size:18px;">String a ="123";
String b = "456";
String c = a + b;
</span>

 
    このようにつづった文字列は123456です.プログラムの実行が完了すると、プログラムの実行のニーズを満たすために、システムは実行プロセスでa,b,cの3つのオブジェクトを確立していることがわかります.つまり、Stringの「+」メソッドを使用して文字列をつなぎ合わせると、プログラム呼び出しと実行のニーズを満たすために多くのStringタイプの新しいオブジェクトが生成されます.したがって、確立されたオブジェクトが多すぎると、システムのパフォーマンスと実行効率が影響を受けます.
◎ StringBuffer:可変クラスで、指定した文字列の変更によって新しいオブジェクトは生成されません.
   StringBufferを使用して、2つの文字列を加算する操作を行います.
<span style="font-family:FangSong_GB2312;font-size:18px;">    StringBuffer sb1 = new StringBuffer(str1);
    sb1.append(str2);
    String result1 = sb1.toString();
</span>

   このプロセスが実行されると、必要な内容はresult 1というオブジェクトのみであり、実行プロセスの間に現れるsb 1はすでにゴミ回収の目標である.これにより、実行中に確立された複数のStringオブジェクトを回避するだけでなく、CPUの利用度を低減することができる.
   この場合、sb 1、sb 2、sb 3の3つの文字列の接合を実現するには、さっきの基礎の上で、実行を続けるだけです.
<span style="font-family:FangSong_GB2312;font-size:18px;">StringBuffer sb2 = new StringBuffer(result1);
sb2.append(str3);
String result2 = sb2.toString();
</span>

   このように,我々に有用なのはresult 2オブジェクトの1つだけであり,生成されたsb 2とresult 1はいずれもシステム回収の目標となっている.文字列の数を増やし続けると、StringBufferとStringのゴミオブジェクトがいくつか生成されます.
   Javaの中のごみはまずメモリを占有して、それからJavaの仮想の機会はごみの回収のスレッドにこれらのごみを回収してもらって、このようにまたCPUの損失が現れて、同僚のこれらのごみのオブジェクトが生成する時もシステムのオーバーヘッドが発生して、だから1つの循環の中で文字列の“+”を使うならば、招いたシステムのオーバーヘッドは無視できないで計り知れないです.
   しかしStringBufferに対して文字列接続を行うと、
<span style="font-family:FangSong_GB2312;font-size:18px;">StringBuffer sb = new StringBuffer();
sb.append(str1);
sb.append(str2);
.....
sb.append(strN);
String result = sb.toString();

</span>

   真ん中の1つのStringBufferオブジェクトを除去すると最後に捨てられ、他は有効なオブジェクトであり、上から発生した1対のゴミよりも効率が向上するのはわずかではない.
二、StringBufferとStringBuilder
◎ StringBuffer
   StringBuffer:文字列変数(Synchronized、つまりスレッドセキュリティ).文字列の内容を頻繁に変更する場合は、効率的にStringBufferを使用することが望ましいが、Stringタイプに変換する場合はStringBufferのtoString()メソッドを呼び出すことができる.
   StringBuffer上の主な動作はappendとinsert法である.
◎ StringBuilder 
    StringBuilder:文字列変数(非スレッドセキュリティ).内部では、StringBuilderオブジェクトは文字列を含む変長配列として扱われます.JAva.lang.StringBuilderは、JDK 5.0に追加された可変文字シーケンスです.これにより、StringBufferと互換性のあるAPIが提供されますが、同期は保証されません.このクラスはStringBufferの簡易置換として設計され,文字列バッファが単一スレッドで使用される場合に用いられる(この場合は一般的である).
両者の比較:
    ほとんどの場合、StringBuilder>StringBufferは実行速度に対して実行されます.前者はスレッドセキュリティの問題を考慮する必要がないからです.
三、三兄弟の長所と短所  
    StringタイプとStringBufferの主なパフォーマンスの違い:Stringは可変オブジェクトであるため、Stringタイプを変更するたびに新しいStringオブジェクトが生成され、ポインタが新しいStringオブジェクトに向けられるため、コンテンツの文字列を常に変更するのはStringを使用するのが最もよく、オブジェクトを生成するたびにシステムのパフォーマンスに影響を与えるため、特にメモリにリファレンスがないオブジェクトが多くなると、JVMのGCが動作し、パフォーマンスが低下します.
   StringBufferクラスを使用すると、新しいオブジェクトを生成してオブジェクト参照を変更するのではなく、StringBufferオブジェクト自体が毎回操作されます.したがって、多くの場合、StringBuffer、特に文字列オブジェクトが頻繁に変更される場合に推奨されます.
   特定の場合、Stringオブジェクトの文字列結合はJava CompilerによってStringBufferオブジェクトにコンパイルされた結合であるため、Stringオブジェクトの速度はStringBufferオブジェクトよりも遅くはありません.たとえば、次のようになります.
<span style="font-family:FangSong_GB2312;font-size:18px;">String s1 = “This is only a” + “ simple” + “ test”;  
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);  </span>

   String s 1オブジェクトを生成する速度はStringBufferより遅くありません.実はJava Compilerでは、次のような変換が自動的に行われています.
Java Compilerは、上記の最初の文を直接コンパイルします.
<span style="font-family:FangSong_GB2312;font-size:18px;">String s1 = “This is only a simple test”;  

</span>

   だからスピードが速い.ただし、スペルされた文字列が別のStringオブジェクトから来ている場合、Java Compilerは自動的に変換されず、速度もそれほど速くありません.
   したがって、少量のデータを操作する場合はStringを使用します.
        単一スレッドは大量のデータを操作し、StringBuilderを使用する.
        マルチスレッドは大量のデータを操作し、StringBufferを使用します.