StringBuffer versus String

Java menyediakan kelas StringBufferdan String, dan Stringkelas tersebut digunakan untuk memanipulasi string karakter yang tidak dapat diubah. Sederhananya, objek bertipe Stringhanya baca dan tidak dapat diubah. The StringBufferkelas digunakan untuk mewakili karakter yang dapat dimodifikasi.

Perbedaan kinerja yang signifikan antara kedua kelas ini StringBufferadalah lebih cepat daripada Stringsaat melakukan penggabungan sederhana. Dalam Stringkode manipulasi, string karakter secara rutin digabungkan. Menggunakan Stringkelas, penggabungan biasanya dilakukan sebagai berikut:

String str = new String ("Stanford"); str + = "Hilang !!";

Jika Anda akan menggunakan StringBufferuntuk 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 appendmetode penggabungan, lebih mahal daripada contoh pertama, yang menggunakan +operator untuk menggabungkan dua Stringobjek.

The +Operator muncul bersalah, tapi kode yang dihasilkan menghasilkan beberapa kejutan. Menggunakan StringBufferfor 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 Stringterlihat 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 StringBufferobjek, lalu memanggil appendmetodenya: StringBufferobjek sementara dibuat di lokasi 10, dan appendmetode ini dipanggil di lokasi 23. Karena Stringkelas tidak dapat diubah, a StringBufferharus digunakan untuk penggabungan.

Setelah penggabungan dilakukan pada StringBufferobjek, itu harus diubah kembali menjadi String. Ini dilakukan dengan panggilan ke toStringmetode di lokasi 26. Metode ini membuat Stringobjek baru dari StringBufferobjek sementara . Pembuatan StringBufferobjek sementara ini dan konversi berikutnya kembali menjadi Stringobjek sangat mahal.

Singkatnya, dua baris kode di atas menghasilkan pembuatan tiga objek:

  1. Sebuah Stringobjek di lokasi 0
  2. Sebuah StringBufferbenda di lokasi 10
  3. Sebuah Stringbenda 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 appendmetode suatu StringBufferobjek. Tidak seperti contoh pertama, bagaimanapun, tidak perlu membuat sementara StringBufferdan kemudian mengubahnya menjadi Stringobjek. Kode ini hanya membuat satu objek StringBuffer, di lokasi 0.

Kesimpulannya, StringBufferpenggabungan secara signifikan lebih cepat daripada Stringpenggabungan. Jelas, StringBuffers harus digunakan dalam jenis operasi ini jika memungkinkan. Jika fungsionalitas Stringkelas diinginkan, pertimbangkan untuk menggunakan a StringBufferuntuk penggabungan dan kemudian melakukan satu konversi ke String.

Reggie Hutcherson adalah penginjil teknologi Sun. Dia menginjili teknologi Sun's Java 2 Platform di seluruh dunia dengan berkonsentrasi pada J2SE dan mesin kinerja HotSpot.

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.