class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Keluaran:
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Keluaran:
true
Catatan: Angka antara -128 dan 127 benar.
Jawaban:
Ketika Anda mengkompilasi angka literal di Jawa dan menetapkannya ke Integer (modal
I
) kompiler memancarkan:Baris kode ini juga dihasilkan ketika Anda menggunakan autoboxing.
valueOf
diimplementasikan sedemikian rupa sehingga angka-angka tertentu "dikumpulkan", dan mengembalikan contoh yang sama untuk nilai yang lebih kecil dari 128.Dari kode sumber java 1.6, baris 621:
Nilai
high
dapat dikonfigurasi ke nilai lain, dengan properti sistem.Jika Anda menjalankan program Anda dengan properti sistem itu, itu akan menampilkan true!
Kesimpulan yang jelas: tidak pernah bergantung pada dua referensi yang identik, selalu membandingkannya dengan
.equals()
metode.Jadi
b2.equals(b3)
akan mencetak true untuk semua nilai yang sama secara logis dari b2, b3.Perhatikan bahwa
Integer
cache tidak ada untuk alasan kinerja, tetapi lebih untuk menyesuaikan dengan JLS, bagian 5.1.7 ; identitas objek harus diberikan untuk nilai -128 hingga 127 inklusif.Integer # valueOf (int) juga mendokumentasikan perilaku ini:
sumber
false
. Sebenarnya, ini mungkin sudah terjadi hari ini, sebagai efek samping dari penerapan Analisis Escape dan Penggantian Skalar.Cache autoboxing -128 hingga 127. Ini ditentukan dalam JLS ( 5.1.7 ).
Aturan sederhana untuk diingat ketika berhadapan dengan objek adalah - gunakan
.equals
jika Anda ingin memeriksa apakah kedua objek "sama", gunakan==
ketika Anda ingin melihat apakah mereka menunjuk ke instance yang sama.sumber
Menggunakan tipe data primitif, int, akan menghasilkan true dalam kedua kasus, output yang diharapkan.
Namun, karena Anda menggunakan objek Integer, operator == memiliki arti yang berbeda.
Dalam konteks objek, == memeriksa untuk melihat apakah variabel merujuk ke referensi objek yang sama.
Untuk membandingkan nilai objek, Anda harus menggunakan metode equals () Eg
yang akan menunjukkan apakah b2 kurang dari b1, lebih besar dari, atau sama dengan (periksa API untuk detail)
sumber
Ini adalah optimasi memori terkait Java.
sumber
Lihatlah Integer.java, jika nilainya antara -128 dan 127, ia akan menggunakan cached pool, jadi
(Integer) 1 == (Integer) 1
sementara(Integer) 222 != (Integer) 222
sumber
Jawaban lain menjelaskan mengapa efek yang diamati dapat diamati, tetapi itu benar-benar tidak penting bagi pemrogram (menarik, tentu saja, tetapi sesuatu yang harus Anda lupakan saat menulis kode yang sebenarnya).
Untuk membandingkan objek Integer untuk kesetaraan, gunakan
equals
metode ini.Jangan mencoba membandingkan objek Integer untuk persamaan dengan menggunakan operator identitas
==
,.Mungkin terjadi bahwa beberapa nilai yang sama adalah objek yang identik, tetapi ini bukan sesuatu yang secara umum harus diandalkan.
sumber
Saya menulis yang berikut karena masalah ini tidak hanya spesifik untuk Integer. Kesimpulan saya adalah bahwa lebih sering daripada tidak jika Anda menggunakan API secara tidak benar, Anda masih akan melihat perilaku yang salah. Gunakan dengan benar dan Anda akan melihat perilaku yang benar:
sumber