-
s = new String("xyz"); Berapa banyak Objek String yang dibuat? Dua objek, satu adalah "xyx" dan yang lainnya adalah objek referensi yang menunjuk ke "xyx".
String s="Halo";int i=3; Apakah ekspresi ini benar? Karena string adalah kelas! Pendekatan yang benar: s+=='3' atau s+='3' atau s+=(char)i;
Kami akan memperkenalkan cara lain untuk membuat objek String - teks diapit tanda kutip. Metode ini unik untuk String, dan sangat berbeda dengan metode baru.
Terdapat kumpulan string di JAVA Virtual Machine (JVM), yang menyimpan banyak objek String dan dapat dibagikan, sehingga meningkatkan efisiensi. String a="abc";, ketika baris kode ini dijalankan, mesin virtual JAVA pertama-tama mencari kumpulan string untuk melihat apakah objek dengan nilai "abc" sudah ada. Dasar penilaiannya adalah kelas String sama dengan(Object obj) Nilai kembalian metode. Jika ada, tidak ada objek baru yang akan dibuat, dan referensi ke objek yang ada akan langsung dikembalikan; jika tidak, objek akan dibuat terlebih dahulu, kemudian ditambahkan ke kumpulan string, dan kemudian referensinya akan dikembalikan.
Pembuatan objek string: Karena banyaknya penggunaan objek string [itu adalah objek, secara umum, objek selalu mengalokasikan memori di heap], di Java, untuk menghemat ruang memori dan waktu berjalan [seperti saat membandingkan string, == lebih baik daripada sama dengan()], semua literal string dimasukkan ke dalam kumpulan literal selama fase kompilasi, dan kumpulan literal runtime menjadi bagian dari kumpulan konstan. Keuntungan dari kumpulan literal adalah semua konstanta string yang sama di kumpulan digabungkan dan hanya menempati satu ruang. Kita tahu bahwa untuk dua variabel referensi, gunakan == untuk menentukan apakah nilai [referensi] mereka sama, yaitu menunjuk ke objek yang sama:
Sekarang lihat pernyataan String s = new String("abc"); Di sini "abc" itu sendiri adalah objek di kumpulan, dan ketika new String() dijalankan saat runtime, salinan objek di kumpulan ditempatkan. di heap. , dan serahkan referensi objek ini di heap ke s. oke, pernyataan ini membuat 2 objek String.
String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //Pernyataan yang tidak akan dieksekusi}
//Berapa banyak Objek String yang dibuat? [Tiga, satu di pool dan dua di heap. ]
Hanya objek baru yang dihasilkan oleh koneksi "+" antara objek String yang dibuat menggunakan tanda kutip untuk menyertakan teks yang akan ditambahkan ke kumpulan string. Untuk semua ekspresi koneksi "+" yang berisi objek baru yang dibuat dalam metode baru (termasuk null), objek baru yang dihasilkannya tidak akan ditambahkan ke kumpulan string.
1.== berarti keduanya direferensikan dari objek yang sama, dan sama dengan() berarti nilainya sama.
String str1 = "abc"; objek yang direferensikan ada di tumpukan (atau kumpulan String).
String str1 =new String ("abc"); Objek yang direferensikan ada di memori/heap.
2.String str1 = "string"; di tumpukan
String str3 = "str"; pada tumpukan
String str4 = "ing"; pada tumpukan
String str2 = str3+str4; di heap, karena fungsi tanda + adalah mengembalikan objek String lain yang baru dibuat alih-alih mencari nilai string di stack. Jika String str2 = "str"+"ing"; maka hasil akhirnya ada di stack. str1==str2 benar.
Namun ada satu situasi yang memerlukan perhatian kita. Silakan lihat kode di bawah ini:
kelas publik StringStaticTest {
String akhir statis publik A = "ab"; // konstanta A
String akhir statis publik B = "cd"; // konstanta B
public static void main(String[] args) {
String s = A + B; // Inisialisasi s dengan menghubungkan dua konstanta dengan +
String t = "abcd";
jika (s == t) {
System.out.println("s sama dengan t, keduanya adalah objek yang sama");
} kalau tidak {
System.out.println("s tidak sama dengan t, keduanya bukan objek yang sama");
}
}
}
Hasil dari menjalankan kode ini adalah sebagai berikut:
s sama dengan t, keduanya merupakan objek yang sama
Pasalnya pada contoh di atas A dan B merupakan konstanta dan nilainya tetap, sehingga nilai s juga tetap, dan sudah ditentukan pada saat kelas dikompilasi. Artinya: String s=A+B; setara dengan: String s="ab"+"cd";
Izinkan saya mengubah sedikit contoh di atas dan lihat apa yang terjadi:
kelas publik StringStaticTest {
String akhir statis publik A; // konstanta A
String akhir statis publik B; // konstanta B
statis {
A = "ab";
B = "cd";
}
public static void main(String[] args) {
// Inisialisasi s dengan menghubungkan dua konstanta dengan +
Tali s = A + B;
String t = "abcd";
jika (s == t) {
System.out.println("s sama dengan t, keduanya adalah objek yang sama");
} kalau tidak {
System.out.println("s tidak sama dengan t, keduanya bukan objek yang sama");
}
}
}
Hasil dari pengoperasiannya adalah sebagai berikut:
s tidak sama dengan t, keduanya bukan objek yang sama
Baru saja dilakukan sedikit perubahan, dan hasilnya justru kebalikan dari contoh tadi. Mari kita analisa lagi. Meskipun A dan B didefinisikan sebagai konstanta (hanya dapat ditetapkan satu kali), keduanya tidak dapat ditetapkan secara langsung. Sebelum nilai s dihitung, kapan ditetapkan dan berapa nilai yang ditetapkan, semuanya adalah variabel. Oleh karena itu, A dan B berperilaku seperti variabel sebelum diberi nilai. Maka s tidak dapat ditentukan pada waktu kompilasi, tetapi hanya dapat dibuat pada saat runtime.
Terakhir, mari kita bahas tentang penyimpanan objek String di JAVA Virtual Machine (JVM), dan hubungan antara kumpulan string serta heap dan stack. Mari kita tinjau dulu perbedaan antara heap dan stack:
Stack: Terutama menyimpan tipe dasar (atau tipe bawaan) (char, byte, short, int, long, float, double, boolean) dan referensi objek. Data dapat dibagikan, dan kecepatannya adalah yang kedua setelah mendaftar tumpukan.
Heap: digunakan untuk menyimpan objek.
Ketika kita melihat kode sumber dari kelas String, kita akan menemukan bahwa ia memiliki atribut value, yang menyimpan nilai dari objek String. Tipenya adalah char[], yang juga menunjukkan bahwa string adalah rangkaian karakter. Saat mengeksekusi String a="abc";, mesin virtual JAVA membuat tiga nilai char 'a', 'b' dan 'c' di tumpukan, dan kemudian membuat objek String di heap, nilainya (nilai ) adalah array dari tiga nilai char yang baru saja dibuat di tumpukan {'a', 'b', 'c'}. Terakhir, objek String yang baru dibuat akan ditambahkan ke kumpulan string.
Jika kita kemudian mengeksekusi kode String b=new String("abc"); karena "abc" telah dibuat dan disimpan di kumpulan string, mesin virtual JAVA hanya akan membuat objek String baru di heap, tetapi itu adalah The value adalah tiga nilai tipe char 'a', 'b' dan 'c' yang dibuat di tumpukan ketika baris kode sebelumnya dieksekusi.
Pada titik ini, kita sudah cukup jelas mengenai pertanyaan mengapa String str=new String("abc") yang dimunculkan di awal artikel ini membuat dua objek.
Artikel ini berasal dari blog CSDN. Harap sebutkan sumbernya saat mencetak ulang: http://blog.csdn.net/yakihappy/archive/2009/03/10/3977169.aspx
Artikel ini berasal dari blog CSDN. Harap sebutkan sumbernya saat mencetak ulang: http://blog.csdn.net/Foxalien/archive/2009/12/18/5029470.aspx
-