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:
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!