それぞれの方法の長所と短所は何ですか。インデックスを更新するたびに char 配列に変換すると配列のコピーが作成されるため、 StringBuilder の方が効率的であると思います。
書かれているように、2 番目の例のコードは 2 つの配列のみを作成しtoCharArray()
ます。実行している要素の操作によって、オブジェクトの割り当てがトリガーされないようにする必要があります。要素の読み取りまたは書き込み時に、配列のコピーが作成されることはありません。String.valueOf()
String
なんらかのString
操作を行う場合、推奨される方法はStringBuilder
. パフォーマンスが非常に重要なコードを記述していて、変換によって文字列の長さが変わらない場合は、配列を直接操作する価値があるかもしれません。しかし、あなたは新しい言語として Java を学んでいるので、高頻度取引やその他のレイテンシーが重要な環境で働いているわけではないと推測します。したがって、おそらくStringBuilder
.
元の長さとは異なる長さの文字列を生成する可能性のある変換を実行している場合は、ほぼ確実にStringBuilder
;を使用する必要があります。必要に応じて内部バッファのサイズを変更します。
これに関連して、単純な文字列連結 (例: s = "a" + someObject + "c"
) を実行している場合、コンパイラは実際にこれらの操作を一連の呼び出しに変換するStringBuilder.append()
ので、見た目が良いと思う方を自由に使用できます。個人的には+
オペレーターの方が好きです。ただし、複数のステートメントにまたがる文字列を作成する場合は、単一のStringBuilder
.
例えば:
public String toString() {
return "{field1 =" + this.field1 +
", field2 =" + this.field2 +
...
", field50 =" + this.field50 + "}";
}
ここには、多くの連結を含む単一の長い式があります。これを手動で最適化することについて心配する必要はありません。コンパイラは単一のを使用し、それを繰り返しStringBuilder
呼び出すだけだからです。append()
String s = ...;
if (someCondition) {
s += someValue;
}
s += additionalValue;
return s;
ここでは、内部で 2 つStringBuilders
のコードが作成されることになりますが、これがレイテンシ クリティカルなアプリケーションで非常にホットなコード パスでない限り、心配する必要はありません。同様のコードを考えると、より多くの個別の連結がある場合、最適化する価値があるかもしれません。文字列が非常に大きい可能性があることがわかっている場合も同様です。しかし、ただ推測するのではなく、測定してください。修正を試みる前に、パフォーマンスの問題があることを実証します。 (注: これは「マイクロ最適化」の一般的なルールにすぎません。明示的に a を使用することのマイナス面はめったにありStringBuilder
ません。ただし、測定可能な違いが生じると想定しないでください。心配な場合は、実際に を測定する必要があります。)
String s = "";
for (final Object item : items) {
s += item + "\n";
}
ここでは、各ループ反復で個別の連結操作を実行しています。つまり、StringBuilder
各パスで新しいが割り当てられます。この場合、StringBuilder
コレクションのサイズがわからない可能性があるため、おそらくシングルを使用する価値があります。これは、「ルールを最適化する前にパフォーマンスの問題があることを証明する」の例外と考えます。入力に基づいて操作が複雑になる可能性がある場合は、注意してください。