JAVAで文字列を扱う「三兄弟」


JAVAで文字列の処理によく使われるクラスは、java.lang.String、java.lang.StringBuffer、java.lang.StringBuilderの3つです.これらの3つの共通点はfinalクラスであり、継承は許されません.これは主に性能と安全性から考えられています.これらのクラスはよく使用されており、パラメータの変更が他のアプリケーションに影響を与えないことを考慮しています.StringBufferとStringBuilderの2つは基本的に差が少ないが、StringBufferはスレッドセキュリティであり、マルチスレッドに追加の同期を必要としない.StringBuilderは非同期で、マルチスレッドで実行するには個別の同期処理が必要ですが、StringBufferよりも高速です.両者の共通点はappend,insertにより文字列の操作を行うことができる.     Stringは、Serializable、Comparable、CharSequenceの3つのインタフェースを実現し、StringBufferおよびStringBuilderは、2つのインタフェースSerializable、CharSequenceのみを実現し、それに比べてStringのインスタンスはcompareToメソッドで比較することができ、他の2つはできない.以下はJDKでString、StringBuffer、StringBuilderについて詳しく説明します.String:Stringクラスは文字列を表します.Javaプログラムのすべての文字列のフォント値(abcなど)は、このようなインスタンスとして実装されます.文字列は定数です.これらの値は作成後は変更できません.文字列バッファは、可変文字列をサポートします.Stringオブジェクトは可変なので共有できます.例:     String str = "abc";  同等:     char data[] = {'a', 'b', 'c'};      String str = new String(data);  文字列の使用方法の例を次に示します.
    System.out.println("abc");

     String cde = "cde";

     System.out.println("abc" + cde);

     String c = "abc".substring(2,3);

     String d = cde.substring(1, 2);

 
 Stringクラスには、シーケンスの単一文字をチェックしたり、文字列を比較したり、文字列を検索したり、サブ文字列を抽出したり、文字列のコピーを作成したり、すべての文字を大文字または小文字に変換したりする方法があります.大文字と小文字のマッピングは、Characterクラスで指定されたUnicode標準版に基づいています. Java言語では、文字列の直列記号(+)と、他のオブジェクトを文字列に変換する特別なサポートがあります.文字列直列はStringBuilder(またはStringBuffer)クラスおよびそのappendメソッドによって実現される.文字列変換は、Objectクラスによって定義され、Java内のすべてのクラスによって継承されるtoStringメソッドによって実現されます.文字列の直列および変換の詳細については、Gosling、Joy、SteeleのThe Java Language Specificationを参照してください. 特に説明しない限り、nullパラメータをこのような構造方法または方法に渡すと、Null PointerExceptionが放出されます.
StringはUTF-16形式の文字列を表し、補足文字はプロキシ・アイテムのペアで表されます(詳細はCharacterクラスのUnicode文字の形式を参照).インデックス値はcharコード単位であるため、補足文字はStringで2つの位置を占めます.Stringクラスは、Unicodeコードポイント(すなわち文字)とUnicodeコードユニット(すなわちchar値)を処理する方法を提供する.StringBuffer:スレッドが安全な可変文字シーケンス.Stringに似た文字列バッファですが、変更できません.任意の時点で特定の文字シーケンスが含まれていますが、いくつかの方法で呼び出すことで、シーケンスの長さと内容を変更できます.文字列バッファは、複数のスレッドに安全に使用できます.これらのメソッドは、必要に応じて同期することができるため、任意の特定のインスタンス上のすべての操作は、関連する各スレッドによるメソッド呼び出し順序と一致するシリアル順序で行われるようになります.StringBuffer上の主な動作はappendメソッドとinsertメソッドであり、これらのメソッドを再ロードして任意のタイプのデータを受け入れることができる.各メソッドは、所与のデータを文字列に効率的に変換し、文字列の文字を文字列バッファに追加または挿入することができる.appendメソッドは、これらの文字をバッファの末端に常に追加します.Insertメソッドでは、指定したポイントに文字を追加します.たとえば、zが現在のコンテンツが「start」の文字列バッファオブジェクトを参照する場合、このメソッドはz.append(「le」)を呼び出すと文字列バッファに「startle」が含まれ、z.insert(4,「le」)は文字列バッファを変更して「starlet」が含まれるようにします.通常、sbがStringBuilderのインスタンスを参照する場合、sb.append(x)とsb.insert(sb.length()、x)は同じ効果を有します.ソース・シーケンスの追加や挿入など、ソース・シーケンスに関連するアクションが発生した場合、クラスはソースで同期するのではなく、このアクションを実行する文字列バッファにのみ同期されます.各文字列バッファには一定の容量があります.文字列バッファに含まれる文字シーケンスの長さがこの容量を超えていない限り、新しい内部バッファ配列を割り当てる必要はありません.内部バッファがオーバーフローした場合、この容量は自動的に増加します.JDK 5から、クラスには単一スレッドで使用される等価クラス、すなわちStringBuilderが追加されます.クラスと比較して、通常はStringBuilderクラスを優先的に使用する必要があります.これは、同じ操作をすべてサポートするためですが、同期を実行しないため、より高速です.StringBuilder:可変文字シーケンスです.これにより、StringBufferと互換性のあるAPIが提供されますが、同期は保証されません.このクラスはStringBufferの簡易置換として設計され,文字列バッファが単一スレッドで使用される場合に用いられる(この場合は一般的である).可能であれば、ほとんどの実装ではStringBufferよりも速いため、クラスを優先することをお勧めします.