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
Lepaskan: 2024-11-03 07:26:02
asal
613 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan