1. Pertama-tama, String bukan milik 8 tipe data dasar. String adalah sebuah objek.
Karena nilai default suatu objek adalah null, maka nilai default String juga null; tetapi merupakan objek khusus dan memiliki beberapa karakteristik yang tidak dimiliki objek lain.
2. new String() dan new String("") keduanya mendeklarasikan string kosong baru, yang merupakan string kosong dan bukan null;
3. String str="kvill";
Perbedaan antara String str=new String ("kvill");:
Di sini, kita tidak akan berbicara tentang heap atau stack, tetapi hanya memperkenalkan konsep sederhana dari kumpulan konstan.
Kumpulan konstan mengacu pada kumpulan yang ditentukan pada waktu kompilasi dan disimpan dalam kumpulan yang dikompilasi. Beberapa data dalam file kelas. Ini mencakup konstanta dalam kelas, metode, antarmuka, dll., serta konstanta string.
Lihat contoh 1:
Copy kode kodenya sebagai berikut:
String s0="kvill";
String s1="kvill";
String s2="kv" + "sakit";
Sistem.keluar.println( s0==s1 );
Sistem.keluar.println( s0==s2 );
Hasilnya adalah:
BENAR
BENAR
Pertama, kita perlu tahu bahwa Java akan memastikan bahwa hanya ada satu salinan konstanta string.
Karena "kvill" dalam s0 dan s1 dalam contoh keduanya merupakan konstanta string, keduanya ditentukan pada waktu kompilasi, jadi s0==s1 adalah benar; dan "kv" dan "ill" juga merupakan konstanta string, Ketika sebuah string digabungkan dengan beberapa konstanta string, itu sendiri harus berupa konstanta string, jadi s2 juga diurai menjadi konstanta string pada waktu kompilasi, jadi s2 juga merupakan salah satu "kvill" di kumpulan kutipan konstan.
Jadi kita mendapatkan s0==s1==s2;
String yang dibuat dengan new String() bukanlah konstanta dan tidak dapat ditentukan pada waktu kompilasi, jadi string yang dibuat dengan new String() tidak dimasukkan ke dalam kumpulan konstanta, melainkan memiliki ruang alamatnya sendiri.
Lihat contoh 2:
Copy kode kodenya sebagai berikut:
String s0="kvill";
String s1=String baru("kvill");
String s2="kv" + String baru("sakit");
Sistem.keluar.println( s0==s1 );
Sistem.keluar.println( s0==s2 );
Sistem.keluar.println( s1==s2 );
Hasilnya adalah:
PALSU
PALSU
PALSU
Dalam Contoh 2, s0 masih merupakan penerapan "kvill" di kumpulan konstan. Karena s1 tidak dapat ditentukan pada waktu kompilasi, ini merupakan referensi ke objek baru "kvill" yang dibuat saat runtime ("sakit"), itu juga tidak dapat ditentukan pada waktu kompilasi, jadi ini juga merupakan aplikasi dari objek "kvill" yang baru dibuat; jika Anda memahami ini, Anda akan tahu mengapa hasil ini diperoleh.
4. String.magang():
Izinkan saya menambahkan satu hal lagi: ada di. Kumpulan konstan dalam file kelas dimuat oleh JVM selama runtime dan dapat diperluas. Metode intern() dari String adalah metode untuk memperluas kumpulan konstanta; ketika instance String str memanggil metode intern(), Java memeriksa apakah ada konstanta string dengan Unicode yang sama di kumpulan konstanta referensinya. Jika Jika tidak, tambahkan string Unicode yang sama dengan str di kumpulan konstan dan kembalikan referensinya akan menjadi jelas dengan melihat Contoh 3. Contoh 3:
Copy kode kodenya sebagai berikut:
String s0= "kvill";
String s1=String baru("kvill");
String s2=String baru("kvill");
Sistem.keluar.println( s0==s1 );
Sistem.keluar.println( "**********" );
s1.magang();
s2=s2.intern(); //Menetapkan referensi "kvill" di kumpulan konstan ke s2
Sistem.keluar.println(s0==s1);
Sistem.keluar.println( s0==s1.intern() );
Sistem.keluar.println( s0==s2 );
Hasilnya adalah:
PALSU
*********
false //Meskipun s1.intern() dijalankan, nilai kembaliannya tidak ditetapkan ke s1
true //Menunjukkan bahwa s1.intern() mengembalikan referensi ke "kvill" di kumpulan konstan
BENAR
Terakhir, izinkan saya menghilangkan kesalahpahaman lainnya:
Seseorang berkata, "Gunakan metode String.intern() untuk menyimpan kelas String ke tabel String global. Jika string Unicode dengan nilai yang sama sudah ada di tabel ini, maka metode ini mengembalikan string yang sudah ada di tabel. alamat , jika tidak ada string dengan nilai yang sama di tabel, daftarkan alamat Anda sendiri di tabel. "Jika saya memahami tabel String global katanya sebagai kumpulan konstan, kalimat terakhirnya adalah," Jika ada string di tabel, Jika tidak ada string dengan nilai yang sama, salah mendaftarkan alamat Anda sendiri di tabel:
Lihat contoh 4:
Copy kode kodenya sebagai berikut:
String s1=String baru("kvill");
String s2=s1.magang();
Sistem.keluar.println( s1==s1.intern() );
Sistem.keluar.println( s1+" "+s2 );
Sistem.keluar.println( s2==s1.intern() );
Hasilnya adalah:
PALSU
kvill kvill
BENAR
Di kelas ini, kami tidak mendeklarasikan konstanta "kvill", jadi tidak ada "kvill" di kumpulan konstanta di awal. Saat kami memanggil s1.intern(), konstanta "kvill" baru ditambahkan ke kumpulan konstanta Ternyata "kvill" yang tidak ada di pool konstan masih ada, artinya tidak "mendaftarkan alamatnya sendiri di pool konstan".
s1==s1.intern() salah, menunjukkan bahwa "kvill" asli masih ada;
s2 sekarang menjadi alamat "kvill" di kumpulan konstan, jadi s2==s1.intern() benar.
5. Tentang sama dengan() dan ==:
Untuk String, ini hanya untuk membandingkan apakah urutan Unicode dari dua string setara, dan mengembalikan nilai true jika keduanya sama; dan == untuk membandingkan apakah alamat kedua string tersebut sama, yaitu apakah keduanya merupakan referensi ke string yang sama.
6. Tentang String tidak dapat diubah
Ada banyak hal yang bisa dikatakan tentang ini. Selama Anda tahu bahwa sebuah instance String tidak akan berubah setelah dibuat, misalnya: String str="kv"+"ill"+" "+"ans";
Ada 4 konstanta string. Pertama, "kv" dan "ill" menghasilkan "kvill" yang disimpan di memori. Kemudian "kvill" digabungkan dengan " " untuk menghasilkan "kvill" dan terakhir disimpan di memori digabungkan dengan "kvill ans" untuk menghasilkan "kvill ans". ; dan menetapkan alamat string ini ke str, karena "kekekalan" String menghasilkan banyak variabel sementara, itulah sebabnya disarankan untuk menggunakan StringBuffer, karena StringBuffer adalah dapat diubah.