1 string
String: String konstan, panjang string tidak dapat diubah.
2 StringBuffer
StringBuffer: String variable (disinkronkan, mis. Thread-safe). Jika Anda ingin sering memodifikasi konten string, yang terbaik adalah menggunakan StringBuffer untuk alasan efisiensi. Jika Anda ingin mengonversi ke jenis string, Anda dapat memanggil metode ToString () StringBuffer.
Java.lang.StringBuffer Urutan karakter yang dapat diubah oleh Thread-Safe. Ini berisi urutan karakter tertentu kapan saja, tetapi panjang dan konten urutan dapat diubah dengan beberapa panggilan metode. Buffer string dapat digunakan dengan aman untuk beberapa utas.
Operasi utama pada StringBuffer adalah metode yang ditambahkan dan dimasukkan, yang dapat kelebihan beban untuk menerima semua jenis data. Setiap metode dapat secara efektif mengubah data yang ditentukan menjadi string, dan kemudian menambahkan atau memasukkan karakter string ke dalam buffer string. Metode Append selalu menambahkan karakter ini ke akhir buffer; Metode insert menambahkan karakter pada titik yang ditentukan. Misalnya, jika Z mengacu pada objek buffer string yang kontennya saat ini "mulai", metode ini memanggil z.append ("le") membuat buffer string berisi "mengejutkan", dan z.insert (4, "le") mengubah buffer string menjadi berisi "bintang muda".
3 StringBuilder
StringBuilder: Variabel String (Non-Thread Safe).
java.lang.stringbuilder adalah urutan karakter variabel yang baru ditambahkan ke JDK5.0. Kelas ini menyediakan API yang kompatibel dengan StringBuffer, tetapi tidak dijamin akan disinkronkan. Kelas ini dirancang untuk menjadi pengganti sederhana untuk StringBuffer, ketika buffer string digunakan oleh satu utas (ini umum). Jika memungkinkan, disarankan untuk mengambil kelas ini terlebih dahulu, karena dalam sebagian besar implementasi lebih cepat daripada StringBuffer. Metode keduanya pada dasarnya sama.
Dalam kebanyakan kasus, StringBuilder> StringBuffer.
4 Perbedaan antara ketiganya
Perbedaan kinerja utama antara tipe string dan stringBuffer: String adalah objek yang tidak dapat diubah. Oleh karena itu, setiap kali jenis string diubah, objek string baru akan dihasilkan, dan kemudian pointer akan diarahkan ke objek string baru. Oleh karena itu, yang terbaik adalah tidak menggunakan string untuk string yang sering mengubah konten, karena setiap kali objek dihasilkan, itu akan berdampak pada kinerja sistem, terutama ketika ada terlalu banyak objek yang dirujuk dalam memori, GC JVM akan mulai bekerja dan kinerjanya akan terdegradasi.
Saat menggunakan kelas StringBuffer, objek StringBuffer itu sendiri dioperasikan setiap kali alih -alih menghasilkan objek baru dan mengubah referensi objek. Oleh karena itu, dalam kebanyakan kasus, StringBuffer direkomendasikan, terutama ketika objek string sering diubah.
Dalam beberapa kasus khusus, splicing string dari objek string sebenarnya ditafsirkan oleh JVM sebagai splicing dari objek StringBuffer, sehingga kecepatan objek string tidak lebih lambat dari objek StringBuffer pada waktu ini, misalnya: misalnya: misalnya: misalnya: misalnya: misalnya: misalnya: misalnya: misalnya: misalnya:
String s1 = "Ini hanya tes" + "sederhana" + "; StringBuffer SB = StringBuilder baru ("Ini hanya A"). Tambahkan ("Sederhana"). Append ("Test"); Menghasilkan Objek String S1 tidak lebih lambat dari StringBuffer. Bahkan, di JVM, konversi berikut secara otomatis dilakukan:
String s1 = "Ini hanya tes" + "sederhana" + ";
JVM secara langsung memperlakukan pernyataan di atas sebagai:
String s1 = "Ini hanya tes sederhana";
Jadi kecepatannya sangat cepat. Tetapi harus dicatat bahwa jika string yang disambung berasal dari objek string lain, JVM tidak akan secara otomatis dikonversi, dan kecepatan tidak akan secepat itu, misalnya:
String s2 = "Ini hanya"; string s3 = "sederhana"; string s4 = "test"; string s1 = s2 + s3 + s4;
Pada saat ini, JVM akan melakukannya secara teratur dengan cara aslinya.
Dalam kebanyakan kasus, StringBuffer> String.
4.StringBuffer dan StringBuilder
Hampir tidak ada perbedaan antara keduanya. Mereka pada dasarnya memanggil berbagai metode kelas induk. Perbedaan penting adalah bahwa StringBuffer aman. Sebagian besar metode internal memiliki kata kunci yang disinkronkan sebelum itu, yang akan menyebabkan konsumsi kinerja tertentu. StringBuilder tidak aman, jadi lebih efisien.
public static void main (string [] args) melempar pengecualian {string string = "0"; int n = 10000; Long begin = system.currentTimemillis (); untuk (int i = 1; i <n; i ++) {string+= i; } long end = System.currentTimeMillis (); panjang antara = end - begin; System.out.println ("waktu yang dikonsumsi menggunakan kelas string:" + antara + "ms"); int n1 = 10000; StringBuffer SB = New StringBuffer ("0"); long start1 = system.currentTimemillis (); untuk (int j = 1; j <n1; j ++) {sb.append (j); } long end1 = system.currentTimeMillis (); panjang antara1 = end1 - begin1; System.out.println ("Waktu yang dikonsumsi menggunakan kelas StringBuffer:" + Antara + "MS"); int n2 = 10000; StringBuilder SB2 = StringBuilder baru ("0"); long start2 = system.currentTimemillis (); untuk (int k = 1; k <n2; k ++) {sb2.append (k); } long end2 = system.currentTimeMillis (); long wets2 = end2 - begin2; System.out.println ("Memakan waktu untuk menggunakan kelas StringBuilder:" + Antara + "ms"); } Keluaran:
Waktu untuk Menggunakan Kelas String: 982ms Waktu untuk Menggunakan StringBuffer Class: 2ms Time untuk Menggunakan StringBuilder Kelas: 1ms
Meskipun angka ini berbeda setiap waktu, dan situasi masing -masing mesin berbeda, ada beberapa poin yang pasti, dan kelas string mengkonsumsi secara signifikan lebih banyak dari dua lainnya. Poin lain adalah bahwa StringBuffer mengkonsumsi lebih dari StringBuilder, meskipun perbedaannya tidak jelas.
5 Strategi Penggunaan
(1) Prinsip Dasar: Jika Anda ingin mengoperasikan sejumlah kecil data, gunakan string; Jika Anda mengoperasikan sejumlah besar data dengan satu utas, gunakan StringBuilder; Jika Anda mengoperasikan sejumlah besar data dengan multi-thread, gunakan StringBuffer.
(2) Jangan gunakan "+" dari kelas string untuk sering menyambung, karena jika kinerjanya sangat buruk, Anda harus menggunakan kelas StringBuffer atau StringBuilder, yang merupakan prinsip yang relatif penting dalam optimasi Java. Misalnya: Saat menggunakan string, saat menyambungkan string, gunakan "+" untuk membentuk objek StringBuffer sementara pada JVM, dan pada saat yang sama, objek dibuat pada setiap string. Setelah menyambungkan dua senar, total 4 objek perlu dibuat! (String yang memegang hasil, dua objek string, dan objek StringBuffer sementara). Jika Anda menggunakan StringBuffer, Anda hanya perlu membuat 2 objek! Objek StringBuffer dan Objek String yang memiliki hasil terakhir.
(3) Untuk kinerja yang lebih baik, kapasitasnya harus ditentukan sebanyak mungkin saat membangun pengadukan atau pengaduk. Tentu saja, jika string yang Anda operasikan tidak melebihi 16 karakter, Anda tidak akan membutuhkannya. Tidak menentukan kapasitas akan secara signifikan mengurangi kinerja.
(4) StringBuilder umumnya digunakan di dalam metode untuk menyelesaikan fungsi "+" yang serupa. Karena ? adalah utas-aman, dapat dibuang setelah digunakan. StringBuffer terutama digunakan dalam variabel global.
(5) Menggunakan pengaduk dalam situasi yang sama hanya dapat mencapai peningkatan kinerja sekitar 10% ~ 15% dibandingkan dengan menggunakan StringBuffer, tetapi mengambil risiko multi-threading tidak aman. Dalam pemrograman modular nyata, programmer yang bertanggung jawab untuk modul tertentu mungkin tidak dapat secara jelas menentukan apakah modul akan dimasukkan ke dalam lingkungan multi-utas. Oleh karena itu, StringBuilder hanya dapat digunakan kecuali jika Anda yakin bahwa hambatan sistem ada di StringBuffer dan Anda yakin bahwa modul Anda tidak akan berjalan dalam mode multi-threaded; Kalau tidak, StringBuffer masih digunakan.