Tidak, tidak cukup.
Pertama, ada sedikit perbedaan dalam semantik. Jika a
ini null
, maka a.concat(b)
melemparkan NullPointerException
tetapi a+=b
akan memperlakukan nilai asli a
seolah-olah itu null
. Selain itu, concat()
metode ini hanya menerima String
nilai 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 += b
sama dengan
a = new StringBuilder()
.append(a)
.append(b)
.toString();
The concat
metode harus lebih cepat. Namun, dengan lebih banyak stringStringBuilder
metode ini menang, setidaknya dalam hal kinerja.
Kode sumber String
dan 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. javac
masih 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 StringBuffer
kode memiliki sedikit keuntungan. Dapat berubah ketika pembaruan berikutnya dirilis, atau jika Anda menggunakan JVM yang berbeda. Dari @lukaseder , daftar intrinsik HotSpot JVM .