Saya yakin semua orang sudah memahami dengan baik perbedaan String dan StringBuffer, namun diperkirakan masih banyak kawan-kawan yang belum paham tentang prinsip kerja kedua kelas ini.Hari ini saya akan mengulas konsep ini untuk semuanya, dan oleh cara J2SE 5.0 menghadirkan kelas manipulasi karakter baru - StringBuilder (jangan terburu-buru melempari saya dengan batu bata, saya masih sadar, saya tidak berbicara tentang C# di sini, Java juga memiliki kelas StringBuilder). Jadi apa perbedaan antara StringBuilder dan StringBuffer ini dan kelas String yang pertama kali kita temui? Yang mana yang harus kita gunakan dalam situasi berbeda? Saya ingin berbagi pandangan saya tentang kategori-kategori ini, dan saya juga berharap semua orang dapat memberikan pendapatnya. Setiap orang pernah melakukan kesalahan, dan sambil memperbaikinya, ini adalah kesempatan yang baik untuk belajar.
Secara singkat, perbedaan kinerja utama antara tipe String dan tipe StringBuffer sebenarnya adalah bahwa String adalah objek yang tidak dapat diubah (Mengapa? Tanyakan kepada desainer Java, mengapa String bukan tipe asli?) Oleh karena itu, setiap kali tipe String diubah , Faktanya, ini sama dengan membuat objek String baru, dan kemudian mengarahkan penunjuk ke objek String baru. Oleh karena itu, sebaiknya tidak menggunakan String untuk string yang sering mengubah konten. , karena setiap objek dihasilkan akan berdampak pada kinerja sistem. Apalagi jika terlalu banyak objek yang tidak direferensikan di memori, GC JVM akan mulai bekerja, dan kecepatannya pasti akan sangat lambat. Berikut adalah contoh yang sangat tidak tepat:
Tali S1 = "abc";
For(int I = 0; I < 10000; I ++) // For mensimulasikan beberapa panggilan program
{
S1 + = "pertahanan";
S1 = "abc";
}
Jika ini masalahnya, setelah perulangan for selesai, jika objek di memori belum dibersihkan oleh GC, akan ada lebih dari 20.000 di memori, angka yang mencengangkan, dan jika ini adalah sistem yang digunakan oleh banyak orang. orang, maka jumlahnya tidak terlalu banyak, sehingga setiap orang harus berhati-hati dalam menggunakannya.
Jika Anda menggunakan kelas StringBuffer, hasilnya akan berbeda. Setiap kali hasilnya adalah operasi pada objek StringBuffer itu sendiri, alih-alih membuat objek baru dan kemudian mengubah referensi objek. Jadi secara umum kami merekomendasikan penggunaan StringBuffer, terutama ketika objek string sering berubah. Dalam beberapa kasus khusus, rangkaian string objek String sebenarnya ditafsirkan oleh JVM sebagai rangkaian objek StringBuffer, sehingga dalam kasus ini kecepatan objek String tidak akan lebih lambat dibandingkan objek StringBuffer, dan khususnya objek string berikut ini adalah dihasilkan Diantaranya, efisiensi String jauh lebih cepat daripada StringBuffer:
String S1 = “Ini hanya” + “sederhana” + “tes”;
StringBuffer Sb = new StringBuilder("Ini hanya a").append("sederhana").append("test");
Anda akan terkejut saat mengetahui bahwa kecepatan menghasilkan objek String S1 terlalu cepat, dan saat ini StringBuffer tidak memiliki keunggulan sama sekali dalam hal kecepatan. Faktanya, ini adalah tipuan JVM
String S1 = “Ini hanya” + “sederhana” + “tes”; Faktanya, ini adalah: String S1 = “Ini hanya tes sederhana”; Namun yang harus diperhatikan semua orang di sini adalah jika string Anda berasal dari objek String lain, kecepatannya tidak akan secepat itu, misalnya:
String S2 = “Ini hanya”;
String S3 = "sederhana";
String S4 = "tes";
Tali S1 = S2 +S3 + S4;
Saat ini, JVM akan berperilaku seperti semula, dan kecepatan pembuatan objek S1 tidak akan secepat sebelumnya. Kita dapat melakukan pengujian untuk memverifikasinya nanti.
Dari sini kita mendapatkan kesimpulan langkah pertama: Dalam kebanyakan kasus, StringBuffer > String
Dan bagaimana StringBuilder membandingkannya dengan mereka? Izinkan saya memperkenalkannya secara singkat terlebih dahulu. StringBuilder adalah kelas yang baru ditambahkan di JDK5.0. Perbedaan antara StringBuffer dan StringBuffer adalah sebagai berikut (sumber: JavaWorld):
Urutan karakter Java.lang.StringBuffer yang aman untuk thread dan dapat diubah. Buffer string mirip dengan String, tetapi tidak dapat dimodifikasi. Buffer string dapat digunakan dengan aman oleh banyak thread. Metode-metode ini dapat disinkronkan bila diperlukan, sehingga semua operasi pada instance tertentu tampak terjadi dalam urutan serial yang konsisten dengan urutan pemanggilan metode yang dilakukan oleh setiap thread yang terlibat.
Setiap buffer string memiliki kapasitas tertentu. Selama panjang urutan karakter yang terdapat dalam buffer string tidak melebihi kapasitas ini, tidak perlu mengalokasikan array buffer internal baru. Kapasitas ini secara otomatis meningkat jika buffer internal meluap. Mulai dari JDK 5.0, kelas setara untuk penggunaan thread tunggal, StringBuilder, telah ditambahkan ke kelas ini. Kelas StringBuilder umumnya harus digunakan sebagai preferensi terhadap kelas ini karena mendukung semua operasi yang sama tetapi lebih cepat karena tidak melakukan sinkronisasi.
Namun tidak aman menggunakan instance StringBuilder dengan banyak thread. Jika sinkronisasi tersebut diperlukan, disarankan untuk menggunakan StringBuffer.
Oleh karena itu, saya rasa semua orang dapat memahami perbedaan di antara keduanya, jadi mari kita buat turunan umum di bawah ini:
Dalam kebanyakan kasus, StringBuilder > StringBuffer
Oleh karena itu, menurut teorema transfer ketidaksetaraan ini: dalam banyak kasus StringBuilder > StringBuffer > String (semakin besar jumlah operasinya, semakin stabil).
Dapatkan system time long start = System.currentTimeMillis(); long end = System.currentTimeMillis();
untuk(i=0;i<str.panjang()/2;i++)
if(str.charAt(i)!=str.charAt(str.length()-i-1))
merusak;
jika(i>=str.panjang()/2)
JOptionPane.showMessageDialog(null,"adalah string palindrom");
kalau tidak
JOptionPane.showMessageDialog(null, "Bukan string palindrom");
}
}
*/
if(str.sama dengan(str2))
JOptionPane.showMessageDialog(null,"adalah string palindrom");
kalau tidak
JOptionPane.showMessageDialog(null, "Bukan string palindrom");
}
}