理想的には、 grepcodenew StringBuilder()
から StringBuilder クラスを少し掘り下げて使用する必要があります。
新しいオブジェクトの作成:
/**
* Creates an AbstractStringBuilder of the specified capacity.
*/
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
new StringBuilder() は、初期容量の char 配列を持つ新しいオブジェクトを作成します。オーバーヘッド: 古いオブジェクトをクリアするために GC が呼び出されます。
delete の使用:
public AbstractStringBuilder delete(int start, int end) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (end > count)
end = count;
if (start > end)
throw new StringIndexOutOfBoundsException();
int len = end - start;
if (len > 0) {
System.arraycopy(value, start+len, value, start, count-end);
count -= len;
}
return this;
}
長さと TrimToSize の使用:
public void trimToSize() {
if (count < value.length) {
value = Arrays.copyOf(value, count);
}
}
配列クラスからcopyOfを呼び出します
public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(元、0、コピー、0、Math.min(元の長さ、新しい長さ)); コピーを返す; }
これで、ネイティブ メソッドであるSystem.arrayCopyも呼び出されます。copyOf を見ると、長さ 0 の新しい charArray が再び作成されており、それにデータを再度追加しようとすると、現在の長さが 0 になるため、expand が呼び出されます。したがって、 new StringBuilder() を呼び出すほうがよいと思います
上記のコードはgrepcodeで確認できます
PS : @ user3241961 は、このオブジェクトの参照を使用している場合に書き込みます。新しい場合は、再度設定する必要があります。