Java 開発者の間では、文字列連結によるリソース消費量の多さがよく話題になります
なぜこれほど多くのリソースを消費するのかについて詳しく説明します。
Java では、文字列オブジェクトは不変です。つまり、一度作成すると変更することはできません。したがって、文字列を連結すると、新しい文字列が作成され、古い文字列がガベージ コレクターによってマークされます。
数百万の文字列を処理すると、ガベージ コレクターによって処理される数百万の追加文字列が生成されます。
仮想マシンの最下層は、文字列を結合するときに多くの操作を実行します。文字列を連結するための最も直接的なドット演算子は、String#concat(String) 演算です。
れぇぇぇぇぇぇぇぇぇ文字配列が作成され、その長さが既存の文字と連結された文字の長さの合計になっていることがわかります。次に、それらの値が新しい文字配列にコピーされます。最後に、この文字配列から String オブジェクトを作成し、それを返します。
したがって、これらの演算は多数あり、計算してみると、その複雑さは O(n^2) であることがわかります。
この問題を解決するには、StringBuilder クラスを使用します。可変の String クラスのようなものです。スプライシング方法は、不必要な重複を避けるのに役立ちます。複雑さは O(n) で、O(n^2) よりもはるかに優れています。
ただし、Java 8 では、デフォルトで StringBuilder を使用して文字列を連結します。
Java 8 ドキュメント:
文字列連結のパフォーマンスを向上させるために、Java コンパイラは StringBuffer クラスまたは同様のテクノロジを使用して、評価式を使用するときに中間 String オブジェクトの作成を減らすことができます。
Java コンパイラはこの状況を処理します:
public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }
上記のコードは次のバイトコードにコンパイルされます:
public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
これらのバイトコードでは StringBuilder が使用されていることがわかります。したがって、Java 8 では StringBuilder クラスを使用する必要がなくなりました。
英語原文: We Don't Need StringBuilder for Concatenation Anymore
以上がJava 8 で文字列を連結するために StringBuilder は必要なくなりましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。