いいえ、違います。
まず、セマンティクスにわずかな違いがあります。場合aでnull、その後、a.concat(b)投げNullPointerExceptionたがa+=b、元の値を扱いますa、それはであるかのようにnull。さらに、concat()メソッドはString値のみを受け入れますが、+演算子は(toString()オブジェクトのメソッドを使用して)サイレントに引数を文字列に変換します。そのため、このconcat()方法では、受け入れるものがより厳密になります。
内部で見るには、次のように簡単なクラスを記述します a += b;
public class Concat {
    String cat(String a, String b) {
        a += b;
        return a;
    }
}
javap -c(Sun JDKに含まれている)で逆アセンブルします。以下を含むリストが表示されます。
java.lang.String cat(java.lang.String, java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuilder
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   7:   aload_1
   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   11:  aload_2
   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/    String;
   18:  astore_1
   19:  aload_1
   20:  areturn
したがって、a += b同等のものです
a = new StringBuilder()
    .append(a)
    .append(b)
    .toString();
concatこの方法は、より高速にする必要があります。ただし、文字列の数が多いほどStringBuilder、少なくともパフォーマンスの点では、このメソッドが優先されます。
Stringand StringBuilder(およびそのパッケージプライベート基本クラス)のソースコードは、Sun JDKのsrc.zipにあります。char配列を構築し(必要に応じてサイズ変更)、finalを作成するときにそれを破棄していることがわかりますString。実際には、メモリ割り当ては驚くほど高速です。
更新: Pawel Adamskiが指摘するように、パフォーマンスは最近のHotSpotで変更されました。javacまったく同じコードを生成しますが、バイトコードコンパイラは不正を行います。コードの本体全体が破棄されるため、単純なテストは完全に失敗します。合計System.identityHashCode(ではないString.hashCode)は、StringBufferコードにわずかな利点があることを示しています。次のアップデートがリリースされたとき、または別のJVMを使用している場合は、変更される可能性があります。@lukaseder、HotSpotのJVMの組み込み関数のリスト。