Java String的intern方法
大家讲道理
大家讲道理 2017-04-17 17:49:54
0
2
411
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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(2)
小葫芦
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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan