String str1 = new StringBuilder("a").append("b").toString(); //1
System.out.println(str1.intern() == str1); //2
String str2 = new StringBuilder("c").toString(); //3
System.out.println(str2.intern() == str2); //4
Terdapat kawasan yang dipanggil kolam pemalar String dalam model memori Java, yang menyimpan pemalar rentetan.
Pertama sekali, apabila versi jdk kurang daripada atau sama dengan 1.6, hasil daripada melaksanakan kod di atas ialah
false
false
Apabila versi jdk lebih besar daripada 1.6, hasil pelaksanaan kod di atas ialah
true
false
Sebab bagi dua keputusan berbeza di atas ialah jvm melaksanakan kaedah intern() secara berbeza.
Dalam jdk1.6 dan sebelum ini, panggil intern()
Jika tiada rentetan dengan nilai yang sama dalam kolam malar, jvm akan menyalin rentetan ke kolam ciptaan dan mengembalikan rentetan dalam kolam malar.
Dalam jdk1.7 dan kemudian, panggil intern()
Jika tiada rentetan dengan nilai yang sama dalam kolam malar, jvm hanya merekodkan rujukan rentetan semasa dalam kolam malar dan mengembalikan rujukan rentetan semasa.
Seterusnya, kami akan menerangkan sebab kod di atas akan mendapat true dan false dalam jdk1.7 dan ke atas.
Apabila kelas yang mengandungi kod di atas dimuatkan oleh JVM, pemalar literal a, b, c akan dimuatkan ke dalam kumpulan pemalar rentetan apabila str1.intern() dilaksanakan, sejak kumpulan pemalar bukan String ab tidak wujud, jvm Rujukan str1 akan direkodkan dalam kumpulan malar dan rujukan str1 akan dikembalikan oleh itu, output baris kedua kod ialah true.
str2 menggunakan pemalar literal c untuk membina rentetan baharu Rujukan rentetan ini berbeza daripada rujukan rentetan c literal dalam kolam pemalar apabila str2.intern() dipanggil. c sudah wujud dalam kolam malar, dan jvm secara langsung mengembalikan rujukan dalam kolam malar, yang berbeza daripada str2 yang dibina semula, jadi output baris 4 kod ialah false.
Objek String yang memanggil kaedah intern() mula-mula akan mencari equals pemalar objek daripada kolam pemalar dan mengembalikannya Jika ia tidak menemuinya, tambahkan equals pemalar objek ke kolam pemalar dan mengembalikannya. Output System.out.println(str1.intern() == str1); ialah true kerana str1 menjadi rujukan kepada pemalar dalam kumpulan pemalar selepas operasi append. System.out.println(str2.intern() == str2); adalah output sebagai false kerana str2 ialah rujukan kepada pembolehubah dan tidak berada dalam kumpulan malar. Oleh itu, kita perlu menilai sama ada str.intern() == str ialah false atau true, terutamanya berdasarkan sama ada str ialah pemalar dalam kumpulan malar Jika ya, hasilnya adalah true, jika tidak hanyalah false.
Terdapat kawasan yang dipanggil kolam pemalar String dalam model memori Java, yang menyimpan pemalar rentetan.
Pertama sekali, apabila versi jdk kurang daripada atau sama dengan 1.6, hasil daripada melaksanakan kod di atas ialah
Apabila versi jdk lebih besar daripada 1.6, hasil pelaksanaan kod di atas ialah
Sebab bagi dua keputusan berbeza di atas ialah jvm melaksanakan kaedah intern() secara berbeza.
Dalam jdk1.6 dan sebelum ini, panggil intern()
Dalam jdk1.7 dan kemudian, panggil intern()
Seterusnya, kami akan menerangkan sebab kod di atas akan mendapat
true
danfalse
dalam jdk1.7 dan ke atas.Apabila kelas yang mengandungi kod di atas dimuatkan oleh JVM, pemalar literal
a
,b
,c
akan dimuatkan ke dalam kumpulan pemalar rentetan apabilastr1.intern()
dilaksanakan, sejak kumpulan pemalar bukan Stringab
tidak wujud, jvm Rujukanstr1
akan direkodkan dalam kumpulan malar dan rujukanstr1
akan dikembalikan oleh itu, output baris kedua kod ialahtrue
.str2
menggunakan pemalar literalc
untuk membina rentetan baharu Rujukan rentetan ini berbeza daripada rujukan rentetanc
literal dalam kolam pemalar apabilastr2.intern()
dipanggil.c
sudah wujud dalam kolam malar, dan jvm secara langsung mengembalikan rujukan dalam kolam malar, yang berbeza daripadastr2
yang dibina semula, jadi output baris 4 kod ialahfalse
.Objek String yang memanggil kaedah
intern()
mula-mula akan mencariequals
pemalar objek daripada kolam pemalar dan mengembalikannya Jika ia tidak menemuinya, tambahkanequals
pemalar objek ke kolam pemalar dan mengembalikannya. OutputSystem.out.println(str1.intern() == str1);
ialahtrue
keranastr1
menjadi rujukan kepada pemalar dalam kumpulan pemalar selepas operasiappend
.System.out.println(str2.intern() == str2);
adalah output sebagaifalse
kerana str2 ialah rujukan kepada pembolehubah dan tidak berada dalam kumpulan malar.Oleh itu, kita perlu menilai sama ada
str.intern() == str
ialahfalse
atautrue
, terutamanya berdasarkan sama adastr
ialah pemalar dalam kumpulan malar Jika ya, hasilnya adalahtrue
, jika tidak hanyalahfalse
.