3つの違いを知るために、これらのメソッドのいくつかを見てみましょう:
最初に、文字列:
/** The value is used for character storage. */
private final char value[];
Stringはchar型の文字配列を保持し、finalキーワードを使用してそれを変更するため、Stringオブジェクトは不変です。StringBuilderを
見てみましょう。
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
/** use serialVersionUID for interoperability */
static final long serialVersionUID = 4383685877147921099L;
public StringBuilder() {
super(16);
}
public StringBuilder(int capacity) {
super(capacity);
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
......
StringBuilderはAbstractStringBuilderを継承し、そのすべての構築メソッドはAbstractStringBuilderからのものであり、次にAbstractStringBuilderクラスを調べます。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;//没有用final修饰
int count;
AbstractStringBuilder() {
}
/**
* 创建指定长度的char数组
*/
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
......
上記のコードからわかるように、char []値はfinalキーワードで変更されていないため、StringBuilderオブジェクトは変数です
。StringBufferを表示する場合も同様です。その作成方法はStringBuilderと同じで、StringBufferが変数であることを示しますオブジェクトですが、他のメソッドはsynchronizedキーワードで装飾されています。つまり、StringBufferは同期ロックを備えたメカニズムを使用してスレッドの安全性を確保しています。StringBuilderメソッドにはこのキーワードがないため、StringBuilderはこれ以上使用できませんスレッド環境。
......
public synchronized StringBuffer append(StringBuffer sb) {
toStringCache = null;
super.append(sb);
return this;
}
/**
* @since 1.8
*/
@Override
synchronized StringBuffer append(AbstractStringBuilder asb) {
toStringCache = null;
super.append(asb);
return this;
}
......
ここで、次の3つの側面から、String、StringBuilder、およびStringBufferを要約します。
可変性: Stringオブジェクトは不変であり、StringBuilderおよびStringBufferは可変オブジェクトです。これは、Stringオブジェクトが文字列を保存するために最終的なキーワードを使用して文字列を保存するのに対し、StringBuilderおよびStringBufferには最終的なキーワードがないためです。- スレッドセーフの
Stringオブジェクトは不変であり、定数として理解できます。スレッドセーフであることは間違いありません
。StringBufferは変数オブジェクトですが、このメソッドは同期キーワードを追加して同期を確保しているため、スレッドセーフです
。StringBuilderスレッドは安全ではありません。 - パフォーマンス
(通常):StringBuilder> StringBuffer> String
Stringは不変であるため、String型を変更するたびに、新しいStringオブジェクトがヒープメモリに生成され、ポインタは新しいStringオブジェクトを指します。文字列オブジェクトは、JVMのガベージコレクションメカニズム(GC)によって収集されます。StringBufferとStringBuilderはどちらもオブジェクト自体を操作し、追加(つまり、このタイプのオブジェクト)を各追加()の後に返します。StringBufferはJavaの同期ロックメカニズムを使用するため、操作はStringBuilderよりも遅くなります。
要約:
- 少量のデータを操作します。文字列を適用します。
- シングルスレッド操作の文字列バッファで大量のデータを操作します。
- マルチスレッド操作は、文字列バッファの下で大量のデータを操作します。StringBufferが適用可能です。