Apa perbedaan utama antara StringBuffer
dan StringBuilder
? Apakah ada masalah kinerja saat memutuskan salah satu dari ini?
java
stringbuilder
stringbuffer
harimau hitam
sumber
sumber
StringBuilder
lebih cepat daripadaStringBuffer
karena tidaksynchronized
.Berikut ini adalah tes benchmark sederhana:
Sebuah uji coba memberikan angka
2241 ms
untukStringBuffer
vs753 ms
untukStringBuilder
.sumber
--> 0
dalam satu lingkaran. Butuh waktu sejenak bagi saya untuk menyadari apa artinya itu. Apakah ini sesuatu yang sebenarnya digunakan dalam praktik alih-alih...; i > 0; i--
sintaks yang biasa ?i -->
benar-benar mengganggu sintaksis ... Saya pikir itu panah pada awalnya karena komentar tentang seni ASCII.main()
Juga, patokan Anda tidak adil. Tidak ada pemanasan.Pada dasarnya,
StringBuffer
metode disinkronkan sementaraStringBuilder
tidak.Operasi "hampir" sama, tetapi menggunakan metode yang disinkronkan dalam satu utas terlalu banyak.
Cukup banyak tentang itu.
Kutipan dari StringBuilder API :
Jadi itu dibuat untuk menggantikannya.
Hal yang sama terjadi dengan
Vector
danArrayList
.sumber
Hashtable
danHashMap
.Cukup gunakan
StringBuilder
kecuali Anda benar-benar mencoba berbagi buffer di antara utas.StringBuilder
adalah adik laki-laki yang tidak disinkronkan (kurang overhead = lebih efisien) dariStringBuffer
kelas yang disinkronkan asli .StringBuffer
datang dulu. Sun prihatin dengan kebenaran dalam semua kondisi, jadi mereka membuatnya disinkronkan agar benang aman untuk berjaga-jaga.StringBuilder
datang kemudian. Sebagian besar penggunaanStringBuffer
adalah utas tunggal dan tidak perlu membayar biaya sinkronisasi.Karena
StringBuilder
merupakan pengganti drop-in untukStringBuffer
tanpa sinkronisasi, tidak akan ada perbedaan antara contoh apa pun.Jika Anda sedang mencoba untuk berbagi antara benang, Anda dapat menggunakan
StringBuffer
, tapi mempertimbangkan apakah tingkat yang lebih tinggi sinkronisasi diperlukan, misalnya mungkin bukan menggunakan StringBuffer, Anda harus melakukan sinkronisasi metode yang menggunakan StringBuilder.sumber
Pertama mari kita lihat kesamaan : Baik StringBuilder dan StringBuffer bisa berubah. Itu berarti Anda dapat mengubah kontennya, dengan di lokasi yang sama.
Perbedaan : StringBuffer bisa berubah dan disinkronkan juga. Sedangkan StringBuilder bisa berubah tetapi tidak disinkronkan secara default.
Arti disinkronkan (sinkronisasi) : Ketika beberapa hal disinkronkan, maka beberapa utas dapat mengakses, dan memodifikasinya tanpa masalah atau efek samping. StringBuffer disinkronkan, sehingga Anda dapat menggunakannya dengan banyak utas tanpa masalah.
Yang mana yang harus digunakan kapan? StringBuilder: Ketika Anda membutuhkan sebuah string, yang dapat dimodifikasi, dan hanya satu utas yang mengakses dan memodifikasinya. StringBuffer: Ketika Anda membutuhkan sebuah string, yang dapat dimodifikasi, dan beberapa utas mengakses dan memodifikasinya.
Catatan : Jangan gunakan StringBuffer secara tidak perlu, yaitu, jangan menggunakannya jika hanya satu utas yang memodifikasi dan mengaksesnya karena memiliki banyak kode penguncian dan pembukaan kunci untuk sinkronisasi yang tidak perlu menghabiskan waktu CPU. Jangan gunakan kunci kecuali jika diperlukan.
sumber
Dalam utas tunggal, StringBuffer tidak secara signifikan lebih lambat dari StringBuilder , berkat optimisasi JVM. Dan dalam multithreading, Anda tidak dapat menggunakan StringBuilder dengan aman.
Ini tes saya (bukan benchmark, hanya tes):
Hasil:
string: 319740
Buffer: 23
Builder: 7!
Jadi Builder lebih cepat daripada Buffer, dan WAY lebih cepat daripada string strings. Sekarang mari kita gunakan Pelaksana untuk banyak utas:
Sekarang StringBuffers mengambil 157 ms untuk 100000 penambahan. Ini bukan tes yang sama, tetapi dibandingkan dengan 37 ms sebelumnya, Anda dapat dengan aman menganggap bahwa menambahkan StringBuffers lebih lambat dengan penggunaan multithreading . Alasannya adalah bahwa JIT / hotspot / compiler / something membuat optimisasi ketika mendeteksi bahwa tidak perlu memeriksa kunci.
Tetapi dengan StringBuilder, Anda memiliki java.lang.ArrayIndexOutOfBoundsException , karena utas bersamaan mencoba menambahkan sesuatu yang seharusnya tidak ada.
Kesimpulannya adalah Anda tidak perlu mengejar StringBuffers. Dan di mana Anda memiliki utas, pikirkan tentang apa yang mereka lakukan, sebelum mencoba untuk mendapatkan beberapa nanodetik.
sumber
withString+="some string"+i+" ; ";
tidak setara dengan dua loop lainnya dan karenanya bukan perbandingan yang adil.StringBuilder diperkenalkan di Java 1.5 sehingga tidak akan bekerja dengan JVM sebelumnya.
Dari Javadocs :
sumber
StringBuilder
.Inilah perbedaannya, saya perhatikan:
StringBuffer: -
StringBuilder: -
Hal yang biasa :-
sumber
StringBuffer
StringBuilder
StringBuffer
tanpa perubahan lainnyasumber
append
dua kali, atauappend
dantoString
tidak aman.StringBuilder tidak aman untuk thread. String Buffer adalah. Info lebih lanjut di sini .
EDIT: Mengenai kinerja, setelah hotspot dimulai, StringBuilder adalah pemenangnya. Namun, untuk iterasi kecil, perbedaan kinerja dapat diabaikan.
sumber
StringBuilder
danStringBuffer
hampir sama. Perbedaannya adalah yangStringBuffer
disinkronkan danStringBuilder
tidak. Meskipun,StringBuilder
lebih cepat daripadaStringBuffer
, perbedaan kinerja sangat sedikit.StringBuilder
adalah pengganti SUN dariStringBuffer
. Itu hanya menghindari sinkronisasi dari semua metode publik. Daripada itu, fungsi mereka sama.Contoh penggunaan yang baik:
Jika teks Anda akan berubah dan digunakan oleh banyak utas, maka lebih baik digunakan
StringBuffer
. Jika teks Anda akan berubah tetapi digunakan oleh utas tunggal, maka gunakanStringBuilder
.sumber
StringBuffer
StringBuffer bisa berubah artinya seseorang dapat mengubah nilai objek. Objek yang dibuat melalui StringBuffer disimpan di heap. StringBuffer memiliki metode yang sama dengan StringBuilder, tetapi setiap metode di StringBuffer disinkronkan yaitu StringBuffer aman untuk thread.
karena ini tidak memungkinkan dua utas untuk secara bersamaan mengakses metode yang sama. Setiap metode dapat diakses oleh satu utas sekaligus.
Tetapi menjadi thread aman juga memiliki kelemahan karena kinerja hit StringBuffer karena properti thread aman. Dengan demikian StringBuilder lebih cepat daripada StringBuffer saat memanggil metode yang sama dari setiap kelas.
Nilai StringBuffer dapat diubah, itu berarti dapat ditetapkan ke nilai baru. Saat ini pertanyaan wawancara yang paling umum, perbedaan antara kelas-kelas di atas. String Buffer dapat dikonversi ke string dengan menggunakan metode toString ().
StringBuilder
StringBuilder sama dengan StringBuffer, yaitu ia menyimpan objek di heap dan juga dapat dimodifikasi. Perbedaan utama antara StringBuffer dan StringBuilder adalah bahwa StringBuilder juga tidak aman. StringBuilder cepat karena tidak aman untuk thread.
Sumber: String Vs StringBuffer Vs StringBuilder
sumber
String
adalah kekal.StringBuffer
adalah bisa berubah dan disinkronkan.StringBuilder
juga bisa berubah tetapi tidak disinkronkan.sumber
The javadoc menjelaskan perbedaan:
sumber
StringBuilder
(diperkenalkan di Java 5) identik denganStringBuffer
, kecuali metodenya tidak disinkronkan. Ini berarti memiliki kinerja yang lebih baik daripada yang terakhir, tetapi kekurangannya adalah tidak aman.Baca tutorial untuk lebih jelasnya.
sumber
Sebuah program sederhana yang menggambarkan perbedaan antara StringBuffer dan StringBuilder:
sumber
StringBuffer digunakan untuk menyimpan string karakter yang akan diubah (objek String tidak dapat diubah). Secara otomatis mengembang sesuai kebutuhan. Kelas terkait: String, CharSequence.
StringBuilder ditambahkan di Java 5. Ini identik dalam semua hal dengan StringBuffer kecuali bahwa itu tidak disinkronkan, yang berarti bahwa jika beberapa utas mengaksesnya pada saat yang sama, mungkin ada masalah. Untuk program single-threaded, kasus yang paling umum, menghindari overhead sinkronisasi membuat StringBuilder sangat cepat
sumber
StringBuilder
locals biasanya lokal untuk suatu metode, di mana mereka terlihat hanya satu utas.StringBuffer
disinkronkan, tetapiStringBuilder
tidak. Akibatnya,StringBuilder
lebih cepat dariStringBuffer
.sumber
StringBuffer bisa berubah. Itu dapat berubah dalam hal panjang dan konten. StringBuffers aman digunakan, yang berarti bahwa mereka memiliki metode yang disinkronkan untuk mengontrol akses sehingga hanya satu utas yang dapat mengakses kode tersinkronisasi objek StringBuffer sekaligus. Dengan demikian, objek StringBuffer umumnya aman untuk digunakan dalam lingkungan multi-threaded di mana beberapa thread mungkin mencoba mengakses objek StringBuffer yang sama pada saat yang sama.
StringBuilder Kelas StringBuilder sangat mirip dengan StringBuffer, kecuali bahwa aksesnya tidak disinkronkan sehingga tidak aman untuk thread. Dengan tidak disinkronkan, kinerja StringBuilder bisa lebih baik daripada StringBuffer. Jadi, jika Anda bekerja di lingkungan single-threaded, menggunakan StringBuilder sebagai ganti StringBuffer dapat menghasilkan peningkatan kinerja. Ini juga berlaku untuk situasi lain seperti variabel lokal StringBuilder (yaitu, variabel dalam suatu metode) di mana hanya satu utas yang akan mengakses objek StringBuilder.
sumber
StringBuffer:
StringBuilder
sumber
String c = a + b
sama denganString c = new StringBuilder().append(a).append(b).toString()
, jadi tidak lebih cepat. Ini hanya bahwa Anda membuat yang baru untuk setiap penugasan string yang, sementara Anda bisa memiliki hanya satu (String d = a + b; d = d + c;
yangString d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();
sementaraStringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();
akan menyimpan satu StringBuilder instanciation).Pembuat String :
Penyangga-Tali
Dianjurkan untuk menggunakan StringBuilder kapan pun dimungkinkan karena lebih cepat daripada StringBuffer. Namun, jika keamanan utas diperlukan, opsi terbaik adalah objek StringBuffer.
sumber
Penggunaan yang lebih baik
StringBuilder
karena tidak disinkronkan dan karenanya menawarkan kinerja yang lebih baik.StringBuilder
adalah pengganti dari yang lebih lamaStringBuffer
.sumber
StringBu(ff|ild)er
adalah variabel lokal yang hanya digunakan oleh satu utas.Karena
StringBuffer
disinkronkan, perlu beberapa upaya ekstra, karenanya berdasarkan kinerja, ini agak lambatStringBuilder
.sumber
Tidak ada perbedaan mendasar antara
StringBuilder
danStringBuffer
, hanya ada beberapa perbedaan di antara mereka. DalamStringBuffer
metode disinkronkan. Ini berarti bahwa pada suatu waktu hanya satu utas yang dapat beroperasi pada mereka. Jika ada lebih dari satu utas maka utas kedua harus menunggu yang pertama selesai dan yang ketiga harus menunggu yang pertama dan yang kedua selesai dan seterusnya. Ini membuat proses sangat lambat dan karenanya kinerja dalam kasusStringBuffer
rendah.Di sisi lain,
StringBuilder
tidak disinkronkan. Ini berarti bahwa pada suatu waktu beberapa utas dapat beroperasi padaStringBuilder
objek yang sama pada saat yang sama. Ini membuat proses sangat cepat dan karenanya kinerjaStringBuilder
tinggi.sumber
A
String
adalah objek yang tidak dapat diubah yang artinya nilainya tidak dapat diubah sementaraStringBuffer
itu bisa berubah.Ini
StringBuffer
Disinkronkan karenanya thread-safe sedangkanStringBuilder
tidak dan hanya cocok untuk instance single-threaded.sumber
Perbedaan utama
StringBuffer
adalah disinkronkan tetapiStringBuilder
tidak. Jika Anda perlu menggunakan lebih dari satu utas, maka StringBuffer direkomendasikan. Namun, sesuai kecepatan eksekusiStringBuilder
lebih cepat daripadaStringBuffer
, karena tidak disinkronkan.sumber
Periksa internal metode
StringBuffer
penambahan yang disinkronkan dan metode penambahan yang tidak disinkronkan dariStringBuilder
.StringBuffer :
StringBuilder :
Karena append adalah
synchronized
,StringBuffer
memiliki overhead kinerja dibandingkan denganStrinbBuilder
skenario multi-threading. Selama Anda tidak berbagi buffer di antara beberapa utas, gunakanStringBuilder
, yang cepat karena tidak adanyasynchronized
metode tambahan.sumber
Berikut ini adalah hasil pengujian kinerja untuk String vs StringBuffer vs StringBuilder . Akhirnya, StringBuilder memenangkan Tes. Lihat di bawah ini untuk kode uji dan hasil.
Kode :
Eksekusi saya pada ideone
Hasil :
100000 iterasi untuk menambahkan satu teks
10000 iterasi untuk menambahkan satu teks
sumber
sumber
StringBuffer disinkronkan dan aman, StringBuilder tidak disinkronkan dan lebih cepat.
sumber