Java menyediakan kelas StringBuffer
dan String
, dan String
kelas tersebut digunakan untuk memanipulasi string karakter yang tidak dapat diubah. Sederhananya, objek bertipe String
hanya baca dan tidak dapat diubah. The StringBuffer
kelas digunakan untuk mewakili karakter yang dapat dimodifikasi.
Perbedaan kinerja yang signifikan antara kedua kelas ini StringBuffer
adalah lebih cepat daripada String
saat melakukan penggabungan sederhana. Dalam String
kode manipulasi, string karakter secara rutin digabungkan. Menggunakan String
kelas, penggabungan biasanya dilakukan sebagai berikut:
String str = new String ("Stanford"); str + = "Hilang !!";
Jika Anda akan menggunakan StringBuffer
untuk melakukan penggabungan yang sama, Anda akan membutuhkan kode yang terlihat seperti ini:
StringBuffer str = new StringBuffer ("Stanford"); str.append ("Hilang !!");
Pengembang biasanya berasumsi bahwa contoh pertama di atas lebih efisien karena mereka berpikir bahwa contoh kedua, yang menggunakan append
metode penggabungan, lebih mahal daripada contoh pertama, yang menggunakan +
operator untuk menggabungkan dua String
objek.
The +
Operator muncul bersalah, tapi kode yang dihasilkan menghasilkan beberapa kejutan. Menggunakan StringBuffer
for concatenation sebenarnya dapat menghasilkan kode yang jauh lebih cepat daripada menggunakan file String
. Untuk mengetahui mengapa ini terjadi, kita harus memeriksa bytecode yang dihasilkan dari dua contoh kita. Bytecode untuk contoh yang digunakan String
terlihat seperti ini:
0 baru # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 baru # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1
Bytecode di lokasi 0 sampai 9 dijalankan untuk baris kode pertama yaitu:
String str = new String ("Stanford");
Kemudian, bytecode di lokasi 10 hingga 29 dijalankan untuk penggabungan:
str + = "Hilang !!";
Hal-hal menjadi menarik di sini. Bytecode yang dihasilkan untuk penggabungan membuat StringBuffer
objek, lalu memanggil append
metodenya: StringBuffer
objek sementara dibuat di lokasi 10, dan append
metode ini dipanggil di lokasi 23. Karena String
kelas tidak dapat diubah, a StringBuffer
harus digunakan untuk penggabungan.
Setelah penggabungan dilakukan pada StringBuffer
objek, itu harus diubah kembali menjadi String
. Ini dilakukan dengan panggilan ke toString
metode di lokasi 26. Metode ini membuat String
objek baru dari StringBuffer
objek sementara . Pembuatan StringBuffer
objek sementara ini dan konversi berikutnya kembali menjadi String
objek sangat mahal.
Singkatnya, dua baris kode di atas menghasilkan pembuatan tiga objek:
- Sebuah
String
objek di lokasi 0 - Sebuah
StringBuffer
benda di lokasi 10 - Sebuah
String
benda di lokasi 26
Sekarang, mari kita lihat bytecode yang dihasilkan untuk contoh menggunakan StringBuffer
:
0 baru # 8 3 dup 4 ldc # 2 6 invokespecial # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop
Bytecode di lokasi 0 hingga 9 dijalankan untuk baris kode pertama:
StringBuffer str = new StringBuffer ("Stanford");
Bytecode di lokasi 10 hingga 16 kemudian dieksekusi untuk penggabungan:
str.append ("Hilang !!");
Perhatikan bahwa, seperti pada contoh pertama, kode ini memanggil append
metode suatu StringBuffer
objek. Tidak seperti contoh pertama, bagaimanapun, tidak perlu membuat sementara StringBuffer
dan kemudian mengubahnya menjadi String
objek. Kode ini hanya membuat satu objek StringBuffer
, di lokasi 0.
Kesimpulannya, StringBuffer
penggabungan secara signifikan lebih cepat daripada String
penggabungan. Jelas, StringBuffer
s harus digunakan dalam jenis operasi ini jika memungkinkan. Jika fungsionalitas String
kelas diinginkan, pertimbangkan untuk menggunakan a StringBuffer
untuk penggabungan dan kemudian melakukan satu konversi ke String
.
Pelajari lebih lanjut tentang topik ini
- " JavaWorld memulai debut kolom kinerja Java mingguan baru," Reggie Hutcherson ( JavaWorld, Maret 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf.html
- "Dasar-dasar kinerja Java," Reggie Hutcherson ( JavaWorld, Maret 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html
- "Masalah kinerja atau masalah desain?" Reggie Hutcherson ( JavaWorld, Maret 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html
- "Pengoptimalan penyusun," Reggie Hutcherson ( JavaWorld, Maret 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html
Artikel ini, "StringBuffer versus String" awalnya diterbitkan oleh JavaWorld.