Dalam Java, rentetan disimpan dalam ingatan sebagai objek String kelas.
Apabila memori diperuntukkan untuk sebarang program Java, JVM (mesin maya Java) membahagikan memori yang diperuntukkan kepada dua bahagian. Satu bahagian ialah Stack dan bahagian lain ialah Heap. Dalam ingatan Heap, java memperuntukkan beberapa memori, terutamanya untuk literal bahawa memori dipanggil String constant pool(SCP). SCP ialah kawasan yang dipratentukan di dalam Heap. Kolam rentetan membantu dalam menjimatkan banyak ruang untuk Java Runtime. Kelas rentetan menggunakan SCP untuk menyimpan literal rentetan unik.
Dalam memori Tindanan, pembolehubah atau rujukan pembolehubah atau rujukan kepada objek disimpan.
Dalam ingatan Heap, semua objek yang diperuntukkan secara dinamik disimpan. Untuk memperuntukkan memori pada objek, kami menggunakan kata kunci baharu.
Terdapat dua cara untuk mencipta objek rentetan.
String str1 = “MyString”;
Setiap kali kami mencipta literal rentetan, JVM mula-mula menyemak sama ada literal rentetan sudah wujud dalam kolam pemalar rentetan. Jika tidak tersedia, ia akan mencipta rentetan literal baharu dalam SCP.
Dalam gambar di atas, str1 menunjuk kepada "MyString" dalam SCP. Berikut ialah cara literal rentetan yang baru dibuat dikendalikan.
String str2 = new String(“MyString”); //Membuat kelas rentetan menggunakan kata kunci baharu
Apabila objek rentetan dibuat menggunakan kata kunci baharu, ia akan mencipta dua objek. Satu dalam SCP satu lagi dalam Heap dan pembolehubah rujukan disimpan dalam tindanan.
Kami telah mencipta "MyString" literal dengan menggunakan
String str1 = “MyString”;
Oleh kerana kita tidak boleh mempunyai pendua dalam SCP, Jadi JVM tidak akan mencipta satu lagi objek dalam SCP tetapi akan mengembalikan rujukan sedia ada kepada pembolehubah str3 dalam tindanan dan ia akan mencipta satu objek dalam Heap. Str3 akan menunjuk ke objek "MyString" dalam Heap tetapi bukan dalam SCP.
Berikut ialah kes yang berbeza tentang cara memori diperuntukkan untuk objek rentetan.
Kes 1: Bagaimana objek rentetan yang ditakrifkan di atas disimpan dalam ingatan.
rentetan kelas awamStorageConcept
{
utama kekosongan statik awam(String[] args)
{
String str1 = “MyString”;
String str2 = new String(“MyString”);
System.out.println(str1 == str2); //Output:Salah
System.out.println(str1.equals(str2)); //Output:Benar
}
}
Apabila kita membandingkan str1 dan str2 menggunakan pengendali “==” ia mengembalikan palsu. Seperti yang kita tahu pengendali “==” membandingkan alamat fizikal mereka. Di sini dalam contoh kami str1 menunjuk ke objek dalam SCP dan str2 menunjuk ke objek dalam Heap. Jadi ia kembali palsu.
Tetapi dalam kes str1.equals(str2), seperti yang kita tahu fungsi "equals" menyemak aksara individu kedua-dua str1 dan str3 mempunyai nilai yang sama disimpan ia kembali benar.
Kes 2: Satu lagi rentetan literal
String str3 = “MyString”;
Kedua-dua str1 dan str3 akan menunjuk kepada literal rentetan yang sama dalam SCP.
rentetan kelas awamStorageConcept
{
utama kekosongan statik awam(String[] args)
{
String str1 = “MyString”;
String str3 = “MyString”;
System.out.println(str1 == str2); //Output:Benar
System.out.println(str1.equals(str2)); //Output:Benar
}
}
s1 == s3 mengembalikan benar, kerana pengendali “==” membandingkan alamat fizikal mereka tetapi bukan kandungannya.
s1.equals(s3) mengembalikan benar dan fungsi "equals" menyemak aksara individu dalam kedua-dua pembolehubah rujukan.
Kes 3: Satu lagi objek rentetan dibuat menggunakan kata kunci baharu
String str4 = new String(“NewString”);
Dalam kes ini, JVM akan menyemak rentetan ini dalam SCP ia tidak dapat mencari objek rentetan dengan nilai "NewString", jadi ia akan mencipta dua objek satu dalam SCP dan satu lagi dalam Heap, pembolehubah rujukan str4 akan disimpan dalam timbunan itu. Str4 akan mempunyai rujukan kepada objek dalam Heap.
Kes 4: Satu lagi rentetan literal dicipta.
String str5 = “NewString”;
Dalam kes ini, JVM akan menyemak dalam SCP jika literal ini sudah tersedia atau tidak, di sini "NewString" sudah ada dalam SCP jadi JVM tidak akan mencipta pendua dalam SCP sebaliknya ia mengembalikan rujukan kepada pembolehubah str5.
Kes 5: Menugaskan satu rentetan kepada rentetan lain
String str4 = new String(“NewString”);
String str6 = str4; //Menetapkan
Di sini str6 dan str4 akan menunjuk ke objek yang sama dalam Heap dan tidak akan memadamkan nilai dalam str4.
rentetan kelas awamStorageConcept
{
utama kekosongan statik awam(String[] args)
{
String str4 = new String(“NewString”);
String str6 = str4;
System.out.println(str4 == str6); //Output:true
}
}
JVM akan memberikan rujukan "NewString" dalam timbunan kepada pembolehubah str6. Itulah sebab str4 == str6 kembali benar.
Kesimpulannya, mencipta objek rentetan menggunakan literal rentetan dan oleh operator 'baharu' mempunyai kebaikan dan keburukannya.
Dengan menggunakan literal rentetan, kita boleh menjadikan memori lebih cekap dengan tidak mencipta pendua. JVM mencipta satu objek unik dan rentetan kekal dalam SCP selama-lamanya. Kelemahan ini ialah kolam rentetan mempunyai saiz tetap dan ia akan menjadi penuh pada suatu masa.
Tetapi dengan menggunakan kata kunci baharu ia mencipta dua objek, satu dalam SCP dan satu lagi dalam Heap. Dalam Timbunan, jika kita tidak memerlukan objek itu akan dipadamkan oleh pemungut sampah untuk membuat ruang. Tetapi kelemahannya ialah dengan pengendali 'baru', JVM akan sentiasa perlu mencipta objek baharu dan ia merupakan beban yang berlebihan untuk JVM.
Atas ialah kandungan terperinci Peruntukan Memori Rentetan dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!