Misteri Kesaksamaan Integer dalam Java
Apabila Java memperkenalkan autoboxing dalam versi 1.5, penggunaan objek Integer boleh ditukar ganti dengan int primitif. Walau bagaimanapun, telah diperhatikan bahawa menggunakan == untuk perbandingan objek Integer boleh membawa kepada hasil yang tidak dijangka.
Dalam situasi yang membingungkan, penggunaan kod == untuk membandingkan pembolehubah Integer didapati tersalah menetapkan bendera boolean sebagai benar apabila nilai sebenarnya adalah sama. Walau bagaimanapun, menukar perbandingan kepada !cdiCt.equals(cdsCt) telah menyelesaikan isu.
Gelagat luar biasa ini timbul daripada mekanisme caching JVM untuk nilai Integer. Untuk nilai dalam julat -128 hingga 127, JVM menggunakan semula kejadian cache, memastikan penggunaan memori yang cekap. Oleh itu, integer dalam julat ini kelihatan sama tanpa mengira rujukan sebenar mereka.
Apabila menggunakan == untuk membandingkan objek Integer, kesamaan rujukan diperiksa dan bukannya kandungan. Oleh itu, jika kejadian cache digunakan, perbandingan akan kembali benar walaupun rujukan objek adalah berbeza.
Isu ini tidak berlaku apabila menggunakan kaedah equals() kerana ia membandingkan nilai objek, tidak mengambil kira rujukan. Akibatnya, adalah disyorkan untuk menggunakan equals() untuk perbandingan objek Integer, terutamanya apabila julat nilai mungkin melangkaui julat cache atau apabila penentuan kesaksamaan yang tepat diperlukan.
Atas ialah kandungan terperinci Mengapakah `==` Kadangkala Gagal Membandingkan Objek `Integer` Dengan Betul di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!