Rumah >Java >javaTutorial >Mengapa Java Mencipta Objek Rentetan Baharu Walaupun Rujukan kepada Huruf yang Sama Wujud dalam Kolam Malar?

Mengapa Java Mencipta Objek Rentetan Baharu Walaupun Rujukan kepada Huruf yang Sama Wujud dalam Kolam Malar?

DDD
DDDasal
2024-11-03 07:26:02664semak imbas

Why Does Java Create a New String Object Even When a Reference to the Same Literal Exists in the Constant Pool?

Java String Constant Pool: Interning and Reference Equality

Pengenalan:

String Constant Pool ialah ciri bagi Mesin Maya Java (JVM) yang menyimpan nilai malar, termasuk literal String. Apabila JVM menemui literal String semasa penyusunan, ia menyemak kumpulan untuk yang sedia ada dengan nilai yang sama. Jika ditemui, rujukan kepada literal baharu dihalakan kepada Rentetan sedia ada, mengelakkan penciptaan tika baharu.

Berlatih dengan Kata Kunci "baharu":

Walau bagaimanapun , penggunaan kata kunci "baharu" semasa mencipta objek String baharu memperkenalkan gelagat berbeza, seperti yang digariskan dalam rujukan yang disediakan. Walaupun rujukan kepada literal String ("ujian" dalam kes ini) masih akan diletakkan dalam kumpulan, JVM bertanggungjawab untuk mencipta objek String baharu pada masa jalan dan bukannya menggunakan semula objek daripada kolam.

Soalan:

Jika rujukan kepada literal String dalam kolam adalah sama seperti apabila dibuat dengan "baharu", bukankah JVM sepatutnya mengembalikan rujukan sedia ada dan bukannya mencipta yang baharu ?

Jawapan:

Tidak, JVM tidak akan mengembalikan rujukan sedia ada apabila pengendali "baru" digunakan. Sebaliknya, ia akan mencipta objek String baharu dan menetapkannya kepada rujukan yang dibuat oleh kata kunci "baharu". Ini kerana:

  • Pelatih Literal: Apabila pengkompil menemui "ujian" literal String, ia menyemak String serupa sedia ada dalam kolam. Oleh kerana tiada satu, objek String baharu dengan nilai "ujian" dibuat dan diletakkan dalam kolam.
  • Pembinaan Objek dengan "baharu": Apabila anda mencipta String baharu objek menggunakan "String(harfiah) baharu," rujukan kepada literal ("ujian") diserahkan kepada pembina. Ini bermakna bahawa rujukan dalam pembina mempunyai nilai yang sama seperti literal dalam kolam.
  • Penciptaan Objek Baharu: Walau bagaimanapun, pengendali "baharu" mengarahkan JVM untuk mencipta String baharu objek. Objek baharu ini ialah tika yang berbeza daripada yang disimpan dalam kolam, walaupun objek tersebut merujuk kepada nilai literal yang sama.

Contoh:

<code class="java">String literal = "test";
String one = new String(literal);
String two = "test";

System.out.println(literal == two); // true (references in pool)
System.out.println(one == two); // false (distinct objects)</code>

Dalam contoh ini, rujukan "harfiah" dan "dua" menghala ke objek String yang sama dalam kolam. Walau bagaimanapun, rujukan "satu" menunjuk kepada objek String berbeza yang dicipta oleh "baru." Oleh itu, perbandingan kesamaan menggunakan "==" mengembalikan palsu.

Penjelasan:

Pernyataan "Apabila pengkompil menemui literal String, ia menyemak kumpulan untuk melihat jika String yang sama sudah wujud" harus ditafsirkan sebagai "dalam kumpulan", bermakna hanya literal String yang telah dimasukkan atau ditambahkan secara eksplisit pada kumpulan akan dipertimbangkan untuk latihan.

Atas ialah kandungan terperinci Mengapa Java Mencipta Objek Rentetan Baharu Walaupun Rujukan kepada Huruf yang Sama Wujud dalam Kolam Malar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn