StringBuffer berbanding String

Java menyediakan StringBufferdan Stringkelas, dan Stringkelas digunakan untuk memanipulasi rentetan watak yang tidak dapat diubah. Secara ringkas, objek jenis Stringhanya boleh dibaca dan tidak berubah. The StringBufferkelas digunakan untuk mewakili aksara yang boleh diubah suai.

Perbezaan prestasi yang ketara antara kedua kelas ini StringBufferadalah lebih cepat daripada Stringketika melakukan penggabungan sederhana. Dalam Stringkod manipulasi, rentetan watak digabungkan secara rutin. Menggunakan Stringkelas, penggabungan biasanya dilakukan seperti berikut:

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

Sekiranya anda menggunakan StringBufferuntuk melakukan penggabungan yang sama, anda memerlukan kod yang kelihatan seperti ini:

StringBuffer str = StringBuffer baru ("Stanford"); str.append ("Hilang !!");

Pembangun biasanya menganggap bahawa contoh pertama di atas lebih efisien kerana mereka berpendapat bahawa contoh kedua, yang menggunakan appendkaedah untuk penggabungan, lebih mahal daripada contoh pertama, yang menggunakan +operator untuk menggabungkan dua Stringobjek.

The +operator nampaknya tidak bersalah, tetapi kod yang dihasilkan menghasilkan beberapa kejutan. Menggunakan a StringBufferuntuk penggabungan sebenarnya dapat menghasilkan kod yang jauh lebih cepat daripada menggunakan a String. Untuk mengetahui mengapa ini berlaku, kita mesti mengkaji bytecode yang dihasilkan dari dua contoh kita. Bytecode untuk contoh menggunakan Stringkelihatan seperti ini:

0 baru # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 new # 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 hingga 9 dijalankan untuk baris pertama kod, iaitu:

 String str = String baru ("Stanford"); 

Kemudian, kod bytec di lokasi 10 hingga 29 dijalankan untuk penggabungan:

 str + = "Hilang !!"; 

Perkara menarik di sini. Bytecode yang dihasilkan untuk penggabungan membuat StringBufferobjek, kemudian menggunakan appendkaedahnya: StringBufferobjek sementara dibuat di lokasi 10, dan appendkaedahnya disebut di lokasi 23. Oleh kerana Stringkelas tidak berubah, StringBuffermesti digunakan untuk penggabungan.

Setelah penggabungan dilakukan pada StringBufferobjek, ia mesti ditukar semula menjadi a String. Ini dilakukan dengan panggilan ke toStringkaedah di lokasi 26. Kaedah ini membuat Stringobjek baru dari StringBufferobjek sementara . Penciptaan StringBufferobjek sementara ini dan penukarannya seterusnya menjadi Stringobjek sangat mahal.

Ringkasnya, dua baris kod di atas menghasilkan tiga objek:

  1. A Stringobjek di lokasi 0
  2. A StringBufferobjek di lokasi 10
  3. A Stringobjek 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 pertama kod:

 StringBuffer str = StringBuffer baru ("Stanford"); 

Bytecode di lokasi 10 hingga 16 kemudian dijalankan untuk penggabungan:

 str.append ("Hilang !!"); 

Perhatikan bahawa, seperti yang berlaku pada contoh pertama, kod ini menggunakan appendkaedah StringBufferobjek. Tidak seperti contoh pertama, bagaimanapun, tidak perlu membuat sementara StringBufferdan kemudian mengubahnya menjadi Stringobjek. Kod ini hanya membuat satu objek, iaitu StringBuffer, di lokasi 0.

Kesimpulannya, StringBufferpenggabungan jauh lebih cepat daripada Stringpenggabungan. Jelas sekali, StringBuffers harus digunakan dalam operasi jenis ini apabila mungkin. Sekiranya fungsi Stringkelas diinginkan, pertimbangkan untuk menggunakan gabungan StringBufferuntuk kemudian lakukan satu penukaran ke String.

Reggie Hutcherson adalah penginjil teknologi Sun. Dia menginjil teknologi Sun 2 Java Platform di seluruh dunia yang berkonsentrasi pada J2SE dan mesin prestasi HotSpot.

Ketahui lebih lanjut mengenai topik ini

  • " JavaWorld melancarkan kolom prestasi Java mingguan baru," Reggie Hutcherson ( JavaWorld, Mac 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf.html

  • "Dasar-dasar prestasi Java," Reggie Hutcherson ( JavaWorld, Mac 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html

  • "Masalah prestasi atau masalah reka bentuk?" Reggie Hutcherson ( JavaWorld, Mac 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html

  • "Pengoptimuman penyusun, " Reggie Hutcherson ( JavaWorld, Mac 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html

Kisah ini, "StringBuffer versus String" pada awalnya diterbitkan oleh JavaWorld.