java - String的intern方法的疑问
天蓬老师
天蓬老师 2017-04-18 10:06:31
0
1
829
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

membalas semua(1)
巴扎黑

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.

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