Tidak, tidak cukup.
Pertama, ada sedikit perbedaan dalam semantik. Jika aini null, maka a.concat(b)melemparkan NullPointerExceptiontetapi a+=bakan memperlakukan nilai asli aseolah-olah itu null. Selain itu, concat()metode ini hanya menerima Stringnilai sementara +operator akan secara diam-diam mengubah argumen menjadi String (menggunakan toString()metode untuk objek). Sehinggaconcat() metode ini lebih ketat dalam apa yang diterimanya.
Untuk melihat di bawah tenda, tulis kelas sederhana dengan a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Sekarang dibongkar dengan javap -c(termasuk dalam Sun JDK). Anda akan melihat daftar termasuk:
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
Jadi, a += bsama dengan
a = new StringBuilder()
.append(a)
.append(b)
.toString();
The concatmetode harus lebih cepat. Namun, dengan lebih banyak stringStringBuilder metode ini menang, setidaknya dalam hal kinerja.
Kode sumber Stringdan StringBuilder(dan kelas dasar paket-privasinya) tersedia di src.zip dari Sun JDK. Anda dapat melihat bahwa Anda sedang membangun array char (mengubah ukuran sesuai kebutuhan) dan kemudian membuangnya ketika Anda membuat final String. Dalam praktiknya alokasi memori sangat cepat.
Pembaruan: Seperti catatan Pawel Adamski, kinerja telah berubah di HotSpot yang lebih baru. javacmasih menghasilkan kode yang persis sama, tetapi kode curang bytecode. Pengujian sederhana sepenuhnya gagal karena seluruh badan kode dibuang. Penjumlahan System.identityHashCode(tidak String.hashCode) menunjukkan StringBufferkode memiliki sedikit keuntungan. Dapat berubah ketika pembaruan berikutnya dirilis, atau jika Anda menggunakan JVM yang berbeda. Dari @lukaseder , daftar intrinsik HotSpot JVM .