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:
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:
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.
Saya menjalankan kod di atas menggunakan JDK6 dan JDK7 masing-masing, dan hasilnya adalah seperti berikut:
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
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:
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:
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:
Mengapakah hasil larian JDK6 dan JDK7 berbeza?
Malah, ini melibatkan pelaksanaan berbeza kaedah intern() dalam JDK yang berbeza:
Dalam JDK6 dan JDK sebelumnya:
Untuk JDK7 dan ke atas:
Berdasarkan perbezaan antara kaedah intern() JDK6 dan JDK7, kita tahu contoh:
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.