Storan JVM bagi String agak istimewa kerana terdapat sekeping String常量池. Kolam renang berterusan ini menyimpan rujukan kepada objek String.
Sebagai contoh, String s = "abc" akan menyemak dahulu sama ada terdapat rujukan sedia ada dalam String常量池 Jika tidak, abc yang diisytiharkan akan terus menjana objek String dan menyimpan rujukan yang menunjuk ke String ini dalam objek String常量池.
Rentetan yang diisytiharkan terus selepas
juga akan mengikut langkah di atas, jadi kali kedua String s2 = "abc" mencari rujukan daripada String常量池 yang menunjuk ke objek rentetan yang diisytiharkan pertama.
Dan new String("abc") akan mencipta objek baharu terus dalam timbunan tanpa memasukkan String常量池. Untuk meletakkan rujukan objek sedemikian ke dalam kolam malar melibatkan kaedah lain kelas String intern(), yang mengembalikan rujukan kolam malar objek String. Jika objek ini tiada dalam kolam malar, objek String akan dimasukkan ke dalam kolam malar dan rujukan objek yang sepadan akan dikembalikan.
Kaedah tangkapan skrin pertama str2.intern() == str3.intern() yang digunakan dalam soalan ini juga akan mengembalikan true, dan rujukan intern() dikembalikan dengan memanggil String常量池 adalah sama.
Membantu anda memahami prosesnya. Terdapat beberapa mata dalam Java yang anda boleh ingat 1. Semua rentetan akan dijana dalam kolam malar, sepadan dengan CONSTANT_String_info, yang tidak boleh diubah. 2. Objek biasa hampir selalu dijana dalam timbunan (sudah tentu, terdapat juga beberapa objek khas seperti objek Kelas yang mungkin dijana dalam kawasan kaedah. Ini bergantung pada pelaksanaan mesin maya yang berbeza dan spesifikasi mesin maya tidak wajib) 3.== Semasa membuat penentuan ini, untuk jenis rujukan, analisis akhir adalah membandingkan alamat memori.
Baiklah, sekarang kita mempunyai konsep di atas. Dalam soalan pertama, String s1 = new String("aaa"); Apabila anda mencipta objek baharu, jvm akan membantu anda membuka ruang objek pada timbunan, dan s1 disimpan dalam jadual pembolehubah setempat anda menunjuk ke ruang objek ini (ia boleh difahami buat sementara waktu bahawa s1 menyimpan alamat ruang objek). Jadi anda mencipta dua yang baharu, iaitu dua ruang objek yang berbeza. ==Penghakiman sudah tentu berbeza, kerana s1 dan s2 menunjuk ke ruang yang berbeza.
Soalan kedua, titik pertama di atas, setiap rentetan hanya akan wujud dalam satu salinan dalam kolam malar, jadi str2 menunjuk ke alamat rentetan kolam malar ini, dan str3 juga menunjuk ke alamat rentetan kolam malar ini. ==Penghakiman secara semula jadi adalah sama.
Storan JVM bagi
String
agak istimewa kerana terdapat sekepingString常量池
.Kolam renang berterusan ini menyimpan rujukan kepada objek String.
Sebagai contoh,
Rentetan yang diisytiharkan terus selepasString s = "abc"
akan menyemak dahulu sama ada terdapat rujukan sedia ada dalamString常量池
Jika tidak, abc yang diisytiharkan akan terus menjana objek String dan menyimpan rujukan yang menunjuk ke String ini dalam objekString常量池
.juga akan mengikut langkah di atas, jadi kali kedua
String s2 = "abc"
mencari rujukan daripadaString常量池
yang menunjuk ke objek rentetan yang diisytiharkan pertama.Dan
new String("abc")
akan mencipta objek baharu terus dalam timbunan tanpa memasukkanString常量池
. Untuk meletakkan rujukan objek sedemikian ke dalam kolam malar melibatkan kaedah lain kelas Stringintern()
, yang mengembalikan rujukan kolam malar objek String. Jika objek ini tiada dalam kolam malar, objek String akan dimasukkan ke dalam kolam malar dan rujukan objek yang sepadan akan dikembalikan.Kaedah tangkapan skrin pertama
str2.intern() == str3.intern()
yang digunakan dalam soalan ini juga akan mengembalikantrue
, dan rujukanintern()
dikembalikan dengan memanggilString常量池
adalah sama.Semua jenis data tidak terbina dalam dalam Java adalah rujukan.
String s = new String("xx");
String s = "xx";
Apabila dicipta menggunakan baharu, str2 dan str3 menghala ke ruang memori yang berbeza, jadi str2 dan str3 adalah tidak sama.
Apabila penetapan rentetan digunakan secara langsung, str2 dan str3 menghala ke ruang memori yang sama, jadi str2 dan str3 adalah sama.
Anda boleh menggunakan str2.equals(str3) untuk membandingkan kandungan rentetan.
Salah satunya adalah untuk menyimpan dalam kolam malar, dan satu lagi adalah untuk mencipta objek baharu dalam timbunan
Membantu anda memahami prosesnya. Terdapat beberapa mata dalam Java yang anda boleh ingat
1. Semua rentetan akan dijana dalam kolam malar, sepadan dengan CONSTANT_String_info, yang tidak boleh diubah.
2. Objek biasa hampir selalu dijana dalam timbunan (sudah tentu, terdapat juga beberapa objek khas seperti objek Kelas yang mungkin dijana dalam kawasan kaedah. Ini bergantung pada pelaksanaan mesin maya yang berbeza dan spesifikasi mesin maya tidak wajib)
3.== Semasa membuat penentuan ini, untuk jenis rujukan, analisis akhir adalah membandingkan alamat memori.
Baiklah, sekarang kita mempunyai konsep di atas. Dalam soalan pertama,
String s1 = new String("aaa"); Apabila anda mencipta objek baharu, jvm akan membantu anda membuka ruang objek pada timbunan, dan s1 disimpan dalam jadual pembolehubah setempat anda menunjuk ke ruang objek ini (ia boleh difahami buat sementara waktu bahawa s1 menyimpan alamat ruang objek). Jadi anda mencipta dua yang baharu, iaitu dua ruang objek yang berbeza. ==Penghakiman sudah tentu berbeza, kerana s1 dan s2 menunjuk ke ruang yang berbeza.
Soalan kedua, titik pertama di atas, setiap rentetan hanya akan wujud dalam satu salinan dalam kolam malar, jadi str2 menunjuk ke alamat rentetan kolam malar ini, dan str3 juga menunjuk ke alamat rentetan kolam malar ini. ==Penghakiman secara semula jadi adalah sama.