[Java]String、StringBufferとStrigBuiderの違いと連絡先(ソース)
11438 ワード
文字列は定数です。それらの値は作成後は変更できません。文字列バッファは可変文字列をサポートします。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クラスに含まれている方法は、シーケンスの単一文字、比較文字列、検索文字列、サブ文字列の抽出、文字列のコピーの作成、すべての文字を大文字または小文字に変換するために使用できます。大きさと小文字のマッピングは、Charcterクラスで指定されたUnicode標準版に基づいています。Java言語は、文字列の直列記号("+")と他のオブジェクトを文字列に変換するための特別なサポートを提供します。文字列の直列は、StringBuider(またはStringBuffer)クラスおよびそのapped方法によって達成される。文字列変換はtoString法により実現され、この方法はObjectクラスによって定義され、Java内のすべてのクラスによって継承されることができる。文字列の直列と変換に関する詳細は、Gosling、JoyとSteeeleの共著のThe Java Language Specificationを参照してください。
別に説明しない限り、nullパラメータをこのような構造方法または方法に渡すと、Null PointerExceptionがスローされます。
Stringは、UTF-16形式の文字列を表し、その補足文字は、プロキシによって表される(詳細については、CharracterクラスのUnicode文字の形式を参照してください)。インデックス値はcharコードユニットを指しますので、補足文字はStringで2つの位置を占めます。
Stringクラスは、Unicodeコードポイント(文字)とUnicodeコードユニット(char値)を処理する方法を提供します。
スレッドの安全な可変文字列。Stringに似た文字列バッファがありますが、変更はできません。任意の時点では特定の文字列が含まれていますが、いくつかの方法で呼び出して、シーケンスの長さと内容を変更することができます。
文字列バッファを複数のスレッドに安全に使用できます。これらの方法は必要に応じて同期され得るので、任意の特定の例における全ての動作は、関連する各スレッドによる方法の呼び出し順序と一致するシリアル順序で発生するように思われる。
StringBufferでの主な操作は、appedとinsert方法であり、これらの方法を再ロードして、任意の種類のデータを受け入れることができる。各方法は、与えられたデータを文字列に変換し、文字列の文字を文字列バッファに追加または挿入することができます。appedメソッドは常にこれらの文字をバッファの端に追加します。insertメソッドは、指定されたポイントに文字を追加します。
例えば、zが現在の内容が「start」の文字列バッファオブジェクトを参照すると、この方法はz.apped(le)を呼び出して文字列バッファに「startle」が含まれ、z.insert(4,le)は文字列バッファ領域を変更し、「starlet」を含むようにします。
一般に、sbがStringBuiderの一例を引用すると、sb.apped(x)とsb.insert(sb.length()、x)は同じ効果を持つ。
ソースシーケンスに関する動作(ソースシーケンスの追加または挿入など)が発生した場合、このクラスはソースではなく、この動作を実行する文字列バッファにのみ同期を達成する。
各文字列バッファには一定の容量があります。文字列バッファに含まれる文字列の長さがこの容量を超えていない限り、新しい内部バッファ配列を割り当てる必要はありません。内部バッファがオーバーフローしたら、この容量は自動的に増加します。JDK 5からは、このクラスのために、シングルスレッドで使用される等価クラス、すなわちStringBuiderが追加されている。このクラスと比較して、通常はSteringBuiderクラスを優先的に使用すべきであり、すべての同じ動作をサポートするが、同期を実行しないので、速度が速い。
可変文字列。このようなアプリケーションは、StringBufferと互換性のあるAPIを提供するが、同期は保証されていない。このクラスはStringBufferの簡易交換として設計され、文字列バッファ領域で単一スレッドに使用される場合に使用される(この場合は一般的である)。もし可能であれば、このクラスを優先的に採用することを提案します。ほとんどの実装では、SteringBufferよりも速いです。
StringBuider上での主な動作は、appedおよびinsert方法であり、これらの方法は、任意のタイプのデータを受け入れるために再ロードされ得る。各方法は、与えられたデータを効果的に文字列に変換し、文字列の文字を文字列生成器に追加または挿入することができる。appedメソッドは常にこれらの文字をジェネレータの端に追加します。insertメソッドは、指定されたポイントに文字を追加します。
StringBuiderの例を複数のスレッドに使用するのは安全ではない。このような同期が必要なら、SteringBufferを使用することを勧めます。
1.String、StrigBurerとStrigBuiderのソースコードの一部
//String
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
/** * Allocates a new {@code String} so that it represents the sequence of * characters currently contained in the character array argument. The * contents of the character array are copied; subsequent modification of * the character array does not affect the newly created string. * * @param value * The initial value of the string */
public String(String original) {
this.value = Arrays.copyOf(value, value.length);
// original value[];
}
}
//StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
/** * Constructs a string buffer initialized to the contents of the * specified string. The initial capacity of the string buffer is * <code>16</code> plus the length of the string argument. * * @param str the initial contents of the buffer. * @exception NullPointerException if <code>str</code> is <code>null</code> */
public StringBuffer(String str) {
super(str.length() + 16); // , str.length()+16 value[]
append(str); // str value[]
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
}
//StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
/** * Constructs a string builder initialized to the contents of the * specified string. The initial capacity of the string builder is * <code>16</code> plus the length of the string argument. * * @param str the initial contents of the buffer. * @throws NullPointerException if <code>str</code> is <code>null</code> */
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
}
//AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/** * The value is used for character storage. */
char[] value;
/** * Creates an AbstractStringBuilder of the specified capacity. */
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
}
2.Stringにおいてコンストラクタから入ってきた文字列オブジェクトは文字列に分割され、そのプライベートfinalのクラス変数value[]に保存されていることが分かる。new String(「java」)は、value=「{j'、'a'、'v'、'a'」}、このStringオブジェクトのvalue[]をもう変えられなくなり、読むしかないので、スレッド安全です。StringBufferとStrigBuiderはAbstractStringBuilderという抽象的なクラスを継承しています。彼らのコンストラクタから文字列が入ってきました。父の種類のAbstractStrigBuiderに対応するコンストラクタとapped関数を呼び出します。父のコンストラクタは長さを新たに作ります。の配列をしてから、文字列を親類apped関数で文字配列value[]に変換します。(ここのchar valueにはfinalがなく、StringBufferとStrigBuiderの文字列は可変です)。今後はapped()で新しい文字列をvalue[]の末尾に追加します。これでvalue[]の内容と大きさが変わります。
StringBufferは方法に同期ロックをかけたり、呼び出し方法に同期ロックをかけたりしていますので、スレッドは安全です。StringBuiderはスレッドではなく、安全です。
①
String s = "ja" +"va"
②String s1="ja";
StringBuffer sb=new StringBuffer("va");
sb.append(s1);
③String s1="ja";
String s2 = "va";
String s = s1 +s2
コンパイル段階で決定できる文字列定数は、StringまたはStringBufferオブジェクトを作成する必要が全くない。文字列の定数を直接使用する「+」の接続操作が最も効率的です。時間は①<③StringBufferオブジェクトのapped効率は、2つのStringオブジェクトの「+」接続動作よりも高いです。時間的②<③
一般的に実行時間は、遅くともSteringBuider、String Buffer、Stringまでです。
マルチスレッド操作文字列バッファではなく、StringBuiderを使用することを推奨します。
インターフェースの中でただ方法の申明と定数の定義に対して。