Pertama -tama, kita harus jelas bahwa masih ada perbedaan dalam metode magang kelas string di JDK1.6 dan JDK1.7:
Magang di JDK1.6:
Saat memanggil metode magang, pertama -tama, buka kumpulan konstan untuk melihat apakah ada nilai yang sama dengan nilai string saat ini. Jika ada, itu akan secara langsung mengembalikan referensi ke nilai string di kumpulan konstan; Jika tidak ada, string dari tumpukan asli akan disalin ke kumpulan konstan.
Magang di JDK1.7:
Saat memanggil metode magang, pertama -tama, buka kumpulan konstan untuk melihat apakah ada nilai yang sama dengan nilai string saat ini. Jika ada, itu akan secara langsung mengembalikan referensi ke nilai string di kumpulan konstan; Jika tidak ada, itu hanya akan menempatkan referensi ke tumpukan asli di kumpulan konstan, dan tidak akan menyalin seluruh string ke kumpulan konstan.
Ini berarti bahwa JDK1.6 dan JDK1.7 menangani secara berbeda ketika string ini tidak ada di kumpulan konstan.
Berikut ini adalah contoh untuk memverifikasi dan menjelaskan:
Contoh:
public static void main (string [] args) {string str = "str"+new string ("01"); ① str.intern (); ② string str1 = "str01"; ③ system.out.println (str == str1); String str2 = string baru ("str01"); ④ str2.intern (); ⑤ string str3 = "str01"; ⑥ system.out.println (str2 == str3); String str4 = "str01"; ⑦ string str5 = string baru ("str")+string baru ("01"); ⑧ str5.intern (); ⑨ System.out.println (str4 == str5); Di JDK1.6, hasil output adalah:
PALSU
PALSU
PALSU
menjelaskan:
① Selama eksekusi, suatu objek string STR dengan nilai "STR01" akan dibuat dalam memori heap, dan konstanta "str" dan "01" akan dibuat di kumpulan konstan;
② Saat mengeksekusi, pertama -tama pergi ke kumpulan konstan untuk memeriksa apakah ada nilai konstan "STR01" dan menemukan bahwa itu tidak ada. Metode JDK1.6 adalah untuk menghasilkan salinan string "str01" di kumpulan konstan;
③ Selama eksekusi, objek "STR01" akan dibuat di kolam konstan, dan akan ditemukan bahwa itu sudah ada, sehingga tidak akan dibuat baru;
Alasan untuk output pertama false adalah bahwa STR menunjuk ke "STR01" dalam memori heap, sementara STR1 menunjuk ke "STR01" di kumpulan konstan;
④ Saat dieksekusi, objek string STR2 dengan nilai "STR01" akan dibuat dalam memori heap, dan konstanta dengan nilai "STR01" akan dibuat di kumpulan konstan;
⑤ Saat mengeksekusi, pertama -tama pergi ke kumpulan konstan untuk memeriksa apakah ada nilai konstan "str01". Ketika ditemukan bahwa itu ada, itu akan secara langsung mengembalikan referensi konstan ini;
⑥ Selama eksekusi, nilai konstan "STR01" akan dibuat di kumpulan konstan. Jika ditemukan bahwa itu sudah ada, itu tidak akan dibuat;
Alasan untuk output kedua salah adalah bahwa STR2 menunjuk ke "STR01" dalam memori heap, sementara STR3 menunjuk ke "STR01" di kumpulan konstan;
⑦ Selama eksekusi, nilai konstan "STR01" akan dibuat di kumpulan konstan;
⑧ Ketika mengeksekusi, objek string STR5 dengan nilai "str01" akan dibuat dalam memori heap, dan konstanta "str" dan "01" akan dibuat di kumpulan konstan;
⑨ Saat mengeksekusi, kumpulan konstan akan digunakan untuk memeriksa apakah ada nilai konstan "STR01". Jika ditemukan, itu akan secara langsung mengembalikan referensi konstan ini;
Alasan untuk output ketiga salah adalah bahwa STR5 menunjuk ke "STR01" dalam memori heap, sementara STR4 menunjuk ke "STR01" di kumpulan konstan;
Di JDK1.7, hasil output adalah:
BENAR
PALSU
PALSU
menjelaskan:
Saya menemukan bahwa hanya hasil output pertama yang berbeda, jadi kami hanya menjelaskan alasan yang pertama:
① Selama eksekusi, STR Objek String dengan nilai "STR01" akan dibuat dalam memori heap, dan konstanta "str" dan "01" akan dibuat di kumpulan konstan; (Ini tidak berbeda dengan JDK1.6)
② Saat mengeksekusi, pertama -tama pergi ke kumpulan konstan untuk memeriksa apakah ada nilai konstan "STR01" dan menemukan bahwa itu tidak ada. Metode JDK1.7 adalah untuk menyalin referensi "STR01" dalam memori heap ke kumpulan konstan;
③ Selama eksekusi, objek "STR01" akan dibuat di kolam konstan, dan akan ditemukan bahwa itu sudah ada, sehingga tidak akan dibuat baru;
Kemudian pada saat ini STR dan STR1 akan menunjuk pada nilai "STR01" dalam memori heap, sehingga keduanya sama;
Di atas adalah perbandingan metode magang dari kelas string di JDK1.6 dan JDK1.7. Ada perbedaan. Teman yang membutuhkannya bisa merujuknya.