Dulu saya sering melihat diskusi tentang splicing string Java dan aspek -aspek lain di internet. Saya melihat beberapa pengembang Java dalam saran mereka kepada pemrogram pemula seperti berikut:
Jangan gunakan tanda + tanda untuk splice string, gunakan metode append () dari StringBuffer atau StringBuilder untuk menyambungkan string.
Namun, sangat menjengkelkan untuk menyambungkan string dengan tanda +. Apakah tidak ada yang baik menggunakan + tanda untuk menyambungkan string?
Dengan mencari beberapa konten tentang kelas string dalam dokumentasi Java API, kita dapat melihat cuplikan berikut:
"Bahasa Java memberikan dukungan khusus untuk simbol gabungan string ("+") dan mengubah objek lain menjadi string. Concatenation string diimplementasikan melalui kelas StringBuilder (atau StringBuffer) dan metode penambahannya. Konversi String diimplementasikan melalui metode Tostring, yang didefinisikan oleh kelas objek dan dapat diwariskan oleh semua kelas dalam JAVA."
Bagian ini dengan jelas memberi tahu kita bahwa di Java, menggunakan + string splicing tanda sebenarnya diimplementasikan oleh StringBuffer atau StringBuilder dan metode append -nya.
Selain dokumentasi API Java, kami juga dapat menggunakan alat untuk melihat perintah bytecode dari file kelas untuk mendapatkan jawaban di atas. Misalnya kode:
public static void main (string [] args) {string a = "hello"; String b = "dunia"; String str = a + b + "!"; System.out.println (str);} Perintah untuk melihat bytecode yang sesuai melalui alat ini adalah sebagai berikut:
Dari perintah bytecode, kita dapat dengan jelas melihat bahwa kode berikut yang kita tulis
String str = a + b + "!";
Itu dikonversi menjadi pernyataan yang mirip dengan yang berikut:
String str = new stringBuilder (string.valueof (a)). Append (b) .Append ("!"). ToString ();Tidak hanya itu, kompiler Java juga merupakan kompiler yang relatif cerdas. Ketika splicing + tanda adalah semua string literal, kompiler java akan secara cerdas mengubahnya menjadi string lengkap selama kompilasi. Misalnya:
public static void main (string [] args) {string str = "hello" + "world" + ", java!"; System.out.println (str);} Kompiler Java secara langsung menyambungkan jenis string ini yang semuanya literal dan mengubahnya menjadi string lengkap saat dikompilasi.
Bahkan jika ada variabel dalam string yang disambung dengan tanda +, kompiler java akan menggabungkan string depan secara literal menjadi satu string.
public static void main (string [] args) {string java = ", java!"; String str = "halo" + "dunia" + java; System.out.println (str);}Dari yang di atas, dapat dilihat bahwa untuk operasi seperti string string = str1 + str2 + str3 + str4, tidak ada masalah dengan menyambungkan beberapa string pada satu waktu.
Di Java, objek string tidak dapat diubah (tidak dapat diubah). Dalam kode, Anda dapat membuat beberapa alias untuk objek string tertentu. Tetapi referensi alias ini sama.
Misalnya, S1 dan S2 adalah alias untuk objek "droidyue.com", dan alias disimpan dalam referensi ke objek nyata. Jadi s1 = s2
String s1 = "droidyue.com"; string s2 = s1; system.out.println ("s1 dan s2 memiliki referensi yang sama =" + (s1 == s2));Dan di Java, satu -satunya operator yang kelebihan beban terkait dengan splicing string. +,+=. Selain itu, desainer Java tidak mengizinkan kelebihan muatan operator lain.
Di Java, satu -satunya operator yang kelebihan beban terkait dengan splicing string. +,+=. Selain itu, desainer Java tidak mengizinkan kelebihan muatan operator lain.
Seperti yang kita semua tahu, sebelum Java 1.4, jahitan string dapat digunakan untuk menyambungkan string. Mulai dari Java 1.5, kita dapat menggunakan StringBuilder untuk menyambungkan string. Perbedaan utama antara StringBuffer dan StringBuilder adalah bahwa StringBuffer aman-utas dan cocok untuk operasi string multi-threaded; StringBuilder aman-utas dan cocok untuk string operasi di bawah satu utas. Namun, sebagian besar operasi jahitan string kami dilakukan di bawah utas tunggal, jadi menggunakan StringBuilder bermanfaat untuk kinerja.
Sebelum Java 1.4, kompiler menggunakan StringBuffer untuk menangani string dengan + tanda string yang disambung; Mulai dari Java 1.5, kompiler menggunakan stringbuilder untuk menangani string dengan + tanda string yang disambung dalam banyak kasus.
Ketika kami menulis kode di lingkungan JDK 1.4, disarankan agar tanda + digunakan untuk menangani situasi di atas di mana banyak string disambung sekaligus. Dengan cara ini, ketika JDK ditingkatkan menjadi 1.5 ke atas, kompiler akan secara otomatis mengonversinya menjadi StringBuilder menjadi string splice, sehingga meningkatkan efisiensi splicing string.
Tentu saja, penggunaan string splicing + tanda yang disarankan hanya terbatas pada penggunaan saat menyambung beberapa string dalam sebuah pernyataan. Jika Anda menyambungkan string dalam beberapa pernyataan, masih disarankan untuk menggunakan StringBuffer atau StringBuilder. Misalnya:
public static void main (string [] args) {string java = ", java!"; String str = ""; str += "halo"; str += "dunia"; str += java; System.out.println (str);} Perintah byte yang dikompilasi dari kompiler adalah sebagai berikut:
Dari gambar di atas, kita dapat mengetahui bahwa masing -masing + tanda splicing tanda membuat objek StringBuilder baru. Situasi ini sangat jelas dalam kondisi siklus, yang mengakibatkan kerugian kinerja yang relatif besar. Oleh karena itu, sangat disarankan untuk menggunakan StringBuffer atau StringBuilder untuk menangani string dalam beberapa pernyataan.
Tentang optimasi yang dibawa dengan menggunakan StringBuilder
Selain itu, saat menggunakan StringBuffer atau StringBuilder, kami juga dapat menggunakan metode berikut untuk lebih meningkatkan kinerja (kode berikut mengambil StringBuilder sebagai contoh, StringBuffer mirip dengan ini).
1. Prediksi panjang maksimum string akhir yang diperoleh.
Panjang default array char di dalam StringBuilder adalah 16. Ketika kita menambahkan string dan melebihi panjang ini, StringBuilder akan memperluas kapasitas array internal untuk memenuhi kebutuhan. Dalam proses ini, StringBuilder membuat array char baru yang lebih besar dan salin data dari array asli ke dalam array baru. Jika kita dapat secara kasar memprediksi panjang maksimum string yang akhirnya disambung, kita dapat menentukan kapasitas awal dari ukuran yang sesuai saat membuat objek StringBuilder. Misalnya, kita perlu menyambung untuk mendapatkan string yang berisi 100 huruf a. Anda dapat menulis kode berikut:
StringBuilder SB = StringBuilder baru (100); untuk (int i = 0; i <100; i ++) {sb.append ('a');} system.out.println (sb);Harap seimbang sesuai dengan kondisi aktual untuk membuat stringbuilder yang cocok untuk kapasitas awal.
2. Untuk karakter individual, gunakan tipe char alih -alih jenis string sebanyak mungkin.
Terkadang, kita perlu menambahkan satu karakter setelah string (misalnya: a), dan kita harus menggunakannya sebanyak mungkin saat ini.
SB.Append ('A');Alih -alih menggunakan:
SB.Append ("A");