cari

Rumah  >  Soal Jawab  >  teks badan

Java String的intern方法

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

大家讲道理大家讲道理2890 hari yang lalu418

membalas semua(2)saya akan balas

  • 高洛峰

    高洛峰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.

    balas
    0
  • ringa_lee

    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.

    balas
    0
  • Batalbalas