cari

Rumah  >  Soal Jawab  >  teks badan

java - String的intern方法的疑问

天蓬老师天蓬老师2806 hari yang lalu846

membalas semua(1)saya akan balas

  • 巴扎黑

    巴扎黑2017-04-18 10:08:31

    Saya menjalankan kod di atas menggunakan JDK6 dan JDK7 masing-masing, dan hasilnya adalah seperti berikut:

    JDK6: false, false
    JDK7: false, false

    Ia tidak benar atau salah seperti yang dikatakan oleh penyoal saya rasa ada dua sebab utama:

    • Rentetan "java" adalah istimewa, ia ditetapkan dalam kolam berterusan

    Oleh itu kod

    String str1 = new StringBuilder("ja").append("va").toString();
    System.out.println(str1.intern() == str1);

    str1.intern() mengembalikan objek dalam kolam malar, jadi ia bukan objek yang sama seperti str1 pada timbunan.

    • Rentetan "python" sudah muncul dalam kod, jadi ia akan ditambahkan pada kolam berterusan.

    Dalam bahagian kedua kod, kerana pemalar literal "python" muncul, ia akan ditambahkan pada kolam pemalar.
    Dan:

    String str2 = new StringBuilder("python").append("").toString();
    System.out.println(str2.intern() == str2);

    Rentetan kosong "" ditambahkan pada rentetan "python", jadi ia bersamaan dengan tidak menambah pemalar rentetan baharu dan str2.intern() masih mengembalikan objek dalam kolam pemalar.


    Malah, soalan di atas boleh dipanjangkan, contohnya:

    // 1
    String str1 = new StringBuilder("ja").append("va1").toString();
    System.out.println(str1.intern() == str1); // true
    // 2
    String str2 = new StringBuilder("python").append("").toString();
    System.out.println(str2.intern() == str2); // false

    Saya baru sahaja menukar bahagian pertama kod "StringBuilder("ja").append("va")" kepada "StringBuilder("ja").append("va1") ? Hasilnya?
    Mari kita lihat hasil larian di bawah JDK6 dan JDK7:

    JDK6: false, false
    JDK7: true, false

    Mengapakah hasil larian JDK6 dan JDK7 berbeza?
    Malah, ini melibatkan pelaksanaan berbeza kaedah intern() dalam JDK yang berbeza:
    Dalam JDK6 dan JDK sebelumnya:

    intern() 方法会把首次遇到的字符串实例 **复制** 到永久代中, 然后返回永久代中的实例.

    Untuk JDK7 dan ke atas:

    当遇到第一次出现的字符串时, intern() **不再复制实例**, 而是在常量池中记录首次出现的实例的引用, 并且 intern() 返回的是此实例引用.

    Berdasarkan perbezaan antara kaedah intern() JDK6 dan JDK7, kita tahu contoh:

    // 1
    String str1 = new StringBuilder("ja").append("va1").toString();
    System.out.println(str1.intern() == str1); // true
    // 2
    String str2 = new StringBuilder("python").append("").toString();
    System.out.println(str2.intern() == str2); // false

    Sebab mengapa hasil yang berbeza dikembalikan dalam JDK yang berbeza:
    Dalam JDK6, "java1" ialah pemalar rentetan pertama yang muncul, jadi ia akan disalin ke kolam malar, dan kaedah intern() mengembalikan Objek dalam kolam malar oleh itu berbeza daripada str1 pada timbunan.
    Dalam JDK7, "java1" ialah pemalar rentetan pertama yang muncul, tetapi kaedah intern() hanya merujuk objek ini Menambah pada kolam malar tidak menyalin a objek baharu kepada kolam malar seperti JDK6, jadi rujukan yang dikembalikan oleh kaedah intern() sebenarnya masih sama dengan str1 asal.

    balas
    0
  • Batalbalas