Java 8 で文字列を結合するために StringBuilder の詳細が不要になった

黄舟
リリース: 2017-03-18 11:20:10
オリジナル
1585 人が閲覧しました

Java 開発者の間では、文字列連結による高いリソース消費がよく話題になります。

それが多くのリソースを占有する理由について詳しく説明します。

Java では、文字列

オブジェクト は不変です。つまり、一度作成されると再度変更することはできません。したがって、文字列を連結すると、新しい文字列が作成され、古い文字列がガベージ コレクターによってマークされます。

何百万もの文字列を処理すると、ガベージ コレクターによって処理される何百万もの余分な文字列が生成されます。

基盤となる仮想マシンは、文字列を結合するときに多くの操作を実行します。文字列を連結するための最も直接的なドット演算子は、String#concat(String) 演算です。

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;
}
ログイン後にコピー
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}
ログイン後にコピー

文字配列が作成され、その長さは既存の文字と連結された文字の長さの合計になっていることがわかります。次に、それらの値が新しい文字配列にコピーされます。最後に、この文字配列から String オブジェクトを作成し、それを返します。

したがって、これらの演算は非常に多く、計算してみると、その複雑さは O(n^2) であることがわかります。

この問題を解決するには、StringBuilder クラスを使用します。可変の String クラスのようなものです。スプライシング方法は、不必要な重複を避けるのに役立ちます。複雑さは O(n) で、O(n^2) よりもはるかに優れています。

ただし、Java 8 では、デフォルトで StringBuilder を使用して文字列を連結します。

Java 8 の

ドキュメントの説明 :

文字列連結のパフォーマンスを向上させるために、Java コンパイラーは StringBuffer クラスまたは同様のテクノロジーを使用して、評価

を使用する際の中間 String オブジェクトの作成を減らすことができます。

Java コンパイラはこの状況を処理します:

public class StringConcatenateDemo {
  public static void main(String[] args) {
     String str = "Hello ";
     str += "world";
   }
}
ログイン後にコピー

上記のコードは次のバイトコードにコンパイルされます:

public class StringConcatenateDemo {
  public StringConcatenateDemo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String Hello
       2: astore_1
       3: new           #3                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      10: aload_1
      11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: ldc           #6                  // String world
      16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: astore_1
      23: return
}
ログイン後にコピー

これらのバイトコードでは StringBuilder が使用されていることがわかります。したがって、Java 8 では StringBuilder クラスを使用する必要がなくなりました。

以上がJava 8 で文字列を結合するために StringBuilder の詳細が不要になったの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート