文字列の連結:concat()と"+"演算子の比較

文字列aとbを仮定すると

a += b
a = a.concat(b)

フードの下では、同じものですか?

参考までに concat を逆コンパイルしてみました。私は + 演算子もデコンパイルできるようにして、それが何をするか見てみたいと思います。

public String concat(String s) {

    int i = s.length();
    if (i == 0) {
        return this;
    }
    else {
        char ac[] = new char[count + i];
        getChars(0, count, ac, 0);
        s.getChars(0, i, ac, count);
        return new String(0, count + i, ac);
    }
}

Niyazは正しいのですが、特殊な+演算子は、Javaコンパイラによってより効率的なものに変換できることも注目すべき点です。 JavaにはStringBuilderクラスがあり、スレッドセーフではない、可変型のStringを表しています。 文字列の連結を大量に行う場合、Javaコンパイラは黙って

String a = b + c + d;

String a = new StringBuilder(b).append(c).append(d).toString();

に変換します。大きな文字列の場合は、この方がはるかに効率的です。 私の知る限りでは、これは concat メソッドを使用した場合には起こりません。

ただし、空の文字列を既存の文字列に連結する場合は、concatメソッドの方が効率的です。 この場合、JVMは新しいStringオブジェクトを作成する必要はなく、既存のStringオブジェクトを返すだけで済みます。 これを確認するには、the concat documentationを参照してください。

ですから、効率を重視するのであれば、空の文字列を連結する場合はconcatメソッドを使い、そうでない場合は+を使うべきです。 しかし、パフォーマンスの差は無視できるものであり、おそらくこのことを気にする必要はないでしょう。

解説 (3)

+ 演算子 は、文字列と文字列、char、整数、double、float のデータ型の値の間で働くことができます。これは、連結の前に値を文字列表現に変換するだけです。

concat 演算子**は、文字列に対してのみ実行できます。データ型の互換性をチェックし、一致しない場合はエラーになります。

この点を除けば、あなたが提供したコードは同じことをしています。

解説 (0)

私はそうは思いません。

a.concat(b)はStringで実装されており,初期のJavaマシンからあまり変わっていないと思います。演算の実装は,Javaのバージョンやコンパイラに依存します。現在、+は、できるだけ高速に動作するように、[StringBuffer][1]を使って実装されています。将来的にはこれが変わるかもしれません。以前のバージョンのJavaでは、文字列に対する+` 演算は中間結果を生成するため、非常に時間がかかりました。

おそらく +=+ を使って実装され、同様に最適化されているのでしょう。

解説 (2)