StringBuilder vs StringBuffer di Java

1. Ikhtisar

Dalam artikel singkat ini, kita akan melihat persamaan dan perbedaan antara StringBuilder dan StringBuffer di Java.

Sederhananya, StringBuilder diperkenalkan di Java 1.5 sebagai pengganti StringBuffer .

2. Persamaan

Baik StringBuilder dan StringBuffer membuat objek yang memiliki urutan karakter yang bisa berubah. Mari kita lihat cara kerjanya, dan perbandingannya dengan kelas String yang tidak dapat diubah :

String immutable = "abc"; immutable = immutable + "def";

Meskipun terlihat seperti kita memodifikasi objek yang sama dengan menambahkan "def" , kita membuat yang baru karena instance String tidak dapat dimodifikasi.

Saat menggunakan StringBuffer atau StringBuilder, kita bisa menggunakan metode append () :

StringBuffer sb = new StringBuffer("abc"); sb.append("def");

Dalam kasus ini, tidak ada objek baru yang dibuat. Kami telah memanggil metode append () pada instance sb dan memodifikasi isinya. StringBuffer dan StringBuilder adalah objek yang bisa berubah.

3. Perbedaan

StringBuffer disinkronkan dan oleh karena itu aman untuk thread. StringBuilder kompatibel dengan StringBuffer API tetapi tanpa jaminan sinkronisasi.

Karena ini bukan implementasi yang aman untuk thread, ini lebih cepat dan disarankan untuk menggunakannya di tempat yang tidak memerlukan keamanan thread.

3.1. Performa

Dalam iterasi kecil, perbedaan kinerja tidak signifikan. Mari kita lakukan benchmark mikro cepat dengan JMH:

@State(Scope.Benchmark) public static class MyState { int iterations = 1000; String initial = "abc"; String suffix = "def"; } @Benchmark public StringBuffer benchmarkStringBuffer(MyState state) { StringBuffer stringBuffer = new StringBuffer(state.initial); for (int i = 0; i < state.iterations; i++) { stringBuffer.append(state.suffix); } return stringBuffer; } @Benchmark public StringBuilder benchmarkStringBuilder(MyState state) { StringBuilder stringBuilder = new StringBuilder(state.initial); for (int i = 0; i < state.iterations; i++) { stringBuilder.append(state.suffix); } return stringBuilder; }

Kami telah menggunakan mode Throughput default - yaitu operasi per unit waktu (skor lebih tinggi lebih baik), yang memberikan:

Benchmark Mode Cnt Score Error Units StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 86169.834 ± 972.477 ops/s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 91076.952 ± 2818.028 ops/s

Jika kita meningkatkan jumlah iterasi dari 1k menjadi 1m maka kita mendapatkan:

Benchmark Mode Cnt Score Error Units StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 77.178 ± 0.898 ops/s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 85.769 ± 1.966 ops/s

Namun, perlu diingat bahwa ini adalah tolok ukur mikro, yang mungkin memiliki atau tidak memiliki pengaruh nyata pada kinerja aplikasi di dunia nyata yang sebenarnya.

4. Kesimpulan

Sederhananya, StringBuffer adalah implementasi yang aman untuk thread dan oleh karena itu lebih lambat daripada StringBuilder .

Dalam program single-threaded, kita bisa menggunakan StringBuilder . Namun, peningkatan kinerja StringBuilder melalui StringBuffer mungkin terlalu kecil untuk menggantikannya di mana-mana. Itu selalu merupakan ide yang baik untuk membuat profil aplikasi dan memahami karakteristik kinerja runtime sebelum melakukan pekerjaan apa pun untuk mengganti satu implementasi dengan yang lain.

Terakhir, seperti biasa, kode yang digunakan selama diskusi dapat ditemukan di GitHub.