Rumah > Soal Jawab > teks badan
String str1 = new StringBuilder("a").append("b").toString();
System.out.println(str1.intern() == str1);
String str2 = new StringBuilder("c").toString();
System.out.println(str2.intern() == str2);
为什么输出结果是:
true
false
高洛峰2017-04-17 17:51:54
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
.
ringa_lee2017-04-17 17:51:54
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
.