Rumah >Java >javaTutorial >Mengapakah `==` Perbandingan Rentetan Akhir dalam Java Kadang-kadang Kembali Benar dan Kadang-kadang Palsu?

Mengapakah `==` Perbandingan Rentetan Akhir dalam Java Kadang-kadang Kembali Benar dan Kadang-kadang Palsu?

Susan Sarandon
Susan Sarandonasal
2024-11-30 16:42:14250semak imbas

Why Does `==` Comparison of Final Strings in Java Sometimes Return True and Sometimes False?

Membandingkan Rentetan Akhir dengan == dalam Java

String dalam Java, yang tidak boleh diubah, berkelakuan unik apabila diisytiharkan sebagai muktamad. Pertimbangkan kod berikut:

String str1 = "str";
String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string"); // false

Di sini, perbandingan mengembalikan palsu, kerana "==" membandingkan rujukan objek. Walau bagaimanapun, jika kami mengisytiharkan rentetan muktamad:

final String str1 = "str";
final String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string"); // true

Sekarang, perbandingan yang tidak dapat dijelaskan kembali benar.

Sebab

Rentetan akhir yang dimulakan dengan ungkapan pemalar masa kompilasi, seperti contoh di atas, menjadi pembolehubah malar dan memperoleh sifat unik: mereka dimasukkan ke dalam penjara. Interning bermakna kejadian unik rentetan dikongsi.

Dalam coretan kod kedua, hasil penggabungan "rentetan" diinternet pada masa penyusunan. Oleh itu, ia berkongsi rujukan yang sama seperti rentetan literal "rentetan" yang dihantar kepada "==". Ini menghasilkan perbandingan sebenar.

Analisis Bytecode

Perbezaan antara kedua-dua versi boleh dilihat dalam bytecode mereka:

  • Bukan -versi akhir: Mencipta StringBuilder dan menggabungkan rentetan semasa runtime, mencipta String baharu objek.
  • Versi akhir: Sebaris rentetan bercantum "rentetan" pada masa penyusunan, secara langsung menggunakan tika intern yang dirujuk.

Kesimpulan

Rentetan akhir dengan ungkapan pemalar masa kompilasi dalam Java dimasukkan dan berkongsi kejadian unik. Ini boleh membawa kepada hasil yang tidak dijangka apabila membandingkannya menggunakan "==" kerana ia secara langsung menyemak rujukan objek dan bukannya nilainya.

Atas ialah kandungan terperinci Mengapakah `==` Perbandingan Rentetan Akhir dalam Java Kadang-kadang Kembali Benar dan Kadang-kadang Palsu?. 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