Artikel ini membawa anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan isu berkaitan tentang kelas rentetan, termasuk kumpulan rentetan yang berterusan, kebolehubah rentetan, dll. Mari lihat kandungan di bawah Saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: "tutorial video java"
Pertama sekali, mari kita lihat kod sumber kelas String dalam JDK Ia melaksanakan banyak antara muka Anda boleh melihat bahawa kelas String diubah suai, yang bermaksud kelas String tidak boleh diwarisi dan tiada subkelas String Dengan cara ini, semua orang yang menggunakan JDK menggunakan kelas String yang sama Kelas rentetan. Kaedah menunjukkan hasil yang berbeza, yang menjadikannya mustahil untuk membangunkan kod
Walaupun pewarisan dan penggantian kaedah membawa fleksibiliti, mereka juga membawa banyak masalah kelakuan tidak konsisten subkelas
Kaedah 1: Tugasan langsung (biasa digunakan)
String str = " hello word "
Kaedah 2: Lulus Kaedah pembinaan menjana objek
String str1 = new String(" hello word ");
Kaedah 3: Hasilkan objek
char[] data = new char[]{'a', 'b','c' };
Kaedah 4: Gunakan String's static method valueOf (sebarang jenis data) = >Tukar kepada rentetan (biasa digunakan)
String str2 = String.valueOf(10 ; > 10.1 --> double literal
true --> boolean literal " abc " – > String literal
Pada masa ini, ini adalah rentetan literal dan objek rentetan Untuk memudahkan pemahaman, lukiskan gambar Ini untuk memudahkan pemahaman kita buat sementara waktu . Sebenarnya,
disimpan dalam kawasan kaedah Jika kita biarkan str2 = "Hello" pada masa ini, ia tidak akan menjejaskan output str kerana ia disertakan dengan " " juga objek rentetan, yang bermaksud ruang baharu dibuka pada timbunan pada masa ini, dan str2 menyimpan ruang alamat objek baharu pada masa ini, yang tidak mempunyai kesan pada str
4 .Perbandingan rentetan adalah sama
Apabila membandingkan semua jenis data rujukan untuk kesamaan, gunakan kaedah sama untuk perbandingan kelas yang biasa digunakan dalam JDK telah mengatasi kaedah sama dan boleh digunakan terus Data rujukan. jenis Apa yang dibandingkan menggunakan == ialah alamat
Gambar di bawah menunjukkan dua rujukan yang menunjuk ke ruang alamat yang sama, yang berkaitan dengan kumpulan rentetan berterusan
Perbandingan sama adalah perbandingan sensitif huruf besar/kecil
Kaedah equalsIgnoreCase ialah perbandingan tidak sensitif huruf besar/kecil
Apabila digunakan Apabila kaedah penetapan langsung menjana objek rentetan, JVM akan mengekalkan kolam pemalar rentetan Jika objek tidak wujud dalam timbunan, objek rentetan akan dijana dan ditambah ke kolam pemalar rentetan apabila kaedah penetapan langsung terus digunakan Apabila menjana objek rentetan, JVM mendapati bahawa kandungan yang ditunjukkan oleh rujukan sudah wujud dalam kumpulan malar Pada masa ini, ia tidak lagi mencipta objek rentetan baharu, tetapi secara langsung menggunakan semula objek sedia ada dalam rajah di atas Rujukan menunjuk ke alamat yang sama
Apabila objek dijana buat kali pertama, tiada apa-apa dalam kolam malar, jadi objek rentetan dijana dalam kolam malar dan disimpan . Apabila yang kedua Apabila objek dijana tiga kali, JVM mendapati bahawa kandungan yang sama telah wujud dalam kumpulan malar, jadi ia tidak lagi menghasilkan objek baharu, menunjuk terus ke ruang alamat yang sama seperti str1
Program ini dilaksanakan dari kanan ke kiri Pada masa ini, sebelah kanan baris pertama kod ialah pemalar rentetan, yang juga rentetan objek, jadi mula-mula buka ruang dalam kolam malar, dan kemudian buat yang baharu Objek rentetan disimpan, dan program dilaksanakan ke kiri Apabila kata kunci baharu ditemui, objek baharu dicipta dan disimpan dalam heap. Kemudian str1 menunjuk ke objek dalam timbunan Apabila menunjuk ke baris kedua dan ketiga kod, kumpulan pemalar ditemui dalam objek dan tidak akan dibuat lagi. objek baharu akan dibuat. Gambar rajah memori adalah seperti berikut:
yang disediakan oleh kelas String Kaedah intern, yang merupakan tempatan. kaedah:
Memanggil kaedah pelatih akan menyimpan objek yang ditunjuk oleh rujukan rentetan semasa ke kolam pemalar rentetan Terdapat dua situasi:
1. Jika Jika objek sudah wujud dalam kolam pemalar semasa, tiada objek baru akan dihasilkan, dan objek String dalam kolam pemalar akan dikembalikan
2. Jika objek tidak wujud dalam kolam pemalar semasa, objek akan dimasukkan ke dalam kolam dan dikembalikan ke kolam tersebut.
1 Lihat pada output baris kod berikut
Oleh kerana kaedah pelatih mempunyai nilai pulangan, str1 hanya memanggil kaedah pelatih pada masa ini dan tidak menerima nilai pulangan. Jadi str1 masih menunjuk ke objek dalam timbunan, str2 menunjuk ke objek dalam kumpulan malar, jadi palsu dikembalikan
Selagi anda menerima nilai pulangan untuk memanggil pelatih. kaedah, ia akan kembali benar;
Pada ketika ini, objek yang ditunjuk oleh str1 ditambah secara manual pada kolam tersebut >
2. Lihat baris Output kod berikut
Apabila memasuki kolam secara manual, tiada apa-apa di dalam kolam, jadi ia dialihkan terus ke dalam kolam malar
Nota: Apa yang dipanggil kebolehubah rentetan bermakna kandungan rentetan tidak berubah, dan Rujukan yang bukan rentetan tidak boleh diubah
Kekal di sini merujuk kepada "hello", "world", "helloworld", "!!!", dan "helloworld!!!" yang disambungkan. "Objek rentetan yang telah dibuat ini tidak boleh mengubah suai kandungannya setelah diisytiharkan, tetapi rujukannya boleh ditukar. Satu akan menunjuk ke hello, satu lagi akan menunjuk ke helloworld, dan satu lagi akan menunjuk ke hello world! ! ! , ini semua mungkin
Rentetan hanyalah tatasusunan aksara—> char[] dan rentetan itu sebenarnya disimpan dalam tatasusunan aksara. Mengapa kandungan rentetan tidak boleh diubah? Mari kita lihat kod sumber rentetan dan ketahui.
Kita dapat melihat bahawa tatasusunan aksara di dalam String dikapsulkan tatasusunan aksara ini tidak boleh diakses dari luar kelas String, apatah lagi menukar kandungan rentetan
String str = " hello ". ;
1. Musnahkan enkapsulasi tatasusunan nilai melalui pantulan pada masa jalan
2. Sebaliknya gunakan StringBuilder atau StringBuffer. Kelas - - bukan lagi jenis
a.StringBuilder: thread-safe, strong performance
b.StringBuffer: thread-safe, poor performance
Selain daripada itu, penggunaan kedua-dua kelas adalah betul-betul sama
Jika anda perlu menyambung rentetan dengan kerap, gunakan kaedah tambah kelas StringBuilder Hanya satu objek dijana di sini, yang menjadi hello untuk seketika dan hello world untuk seketika
<.>
Penukaran bersama antara kelas StringBuilder dan kelas String :
Kaedah lain yang biasa digunakan: a. Operasi pembalikan rentetan () disediakan oleh sb; data, padam (int mula, int tamat); ): Mula memasukkan dari kedudukan indeks permulaan Indeks permulaan sisipan ialah mula
Pembelajaran yang disyorkan: "
"
Atas ialah kandungan terperinci Kuasai sepenuhnya kelas String Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!