Pada Java 1.5, Anda dapat cukup banyak interchange Integer
dengan int
dalam banyak situasi.
Namun, saya menemukan cacat potensial dalam kode saya yang sedikit mengejutkan saya.
Kode berikut:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
tampaknya salah mengatur ketidakcocokan ketika nilainya sama, meskipun saya tidak bisa menentukan dalam keadaan apa. Saya menetapkan breakpoint di Eclipse dan melihat bahwa Integer
nilai keduanya 137, dan saya memeriksa ekspresi boolean dan mengatakan itu salah, tetapi ketika saya melangkahinya, itu membuat ketidakcocokan menjadi kenyataan.
Mengubah persyaratan ke:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
memperbaiki masalah.
Adakah yang bisa menjelaskan mengapa ini terjadi? Sejauh ini, saya hanya melihat perilaku di localhost saya di PC saya sendiri. Dalam kasus khusus ini, kode berhasil melewati sekitar 20 perbandingan, tetapi gagal pada 2. Masalahnya secara konsisten dapat direproduksi.
Jika itu adalah masalah yang lazim, itu harus menyebabkan kesalahan pada lingkungan kami yang lain (dev dan pengujian), tetapi sejauh ini, tidak ada yang melaporkan masalah setelah ratusan tes yang mengeksekusi cuplikan kode ini.
Apakah masih tidak sah untuk digunakan ==
untuk membandingkan dua Integer
nilai?
Selain semua jawaban bagus di bawah ini, tautan stackoverflow berikut memiliki sedikit informasi tambahan. Itu sebenarnya akan menjawab pertanyaan awal saya, tetapi karena saya tidak menyebutkan autoboxing dalam pertanyaan saya, itu tidak muncul dalam saran yang dipilih:
Mengapa kompiler / JVM tidak bisa membuat autoboxing “hanya berfungsi”?
Anda tidak dapat membandingkan dua
Integer
dengan objek yang sederhana==
sehingga sebagian besar referensi waktu tidak akan sama.Ada trik, dengan
Integer
antara -128 dan 127, referensi akan sama dengan penggunaan autoboxingInteger.valueOf()
yang menyimpan bilangan bulat kecil.Sumber:
Pada topik yang sama:
sumber
new Integer(1) == new Integer(1)
masih salah.new ... == new ...
selalufalse
.equals()
saat berhadapan dengan objek. Ini harus menjadi salah satu hal pertama yang harus diketahui ketika belajar Java. Ngomong-ngomong, saya akan menduga bahwa konstruktorInteger
itu pribadi, yaitu bahwa instance selalu dibuat melaluivalueOf()
metode. Tetapi saya melihat bahwa konstruktornya bersifat publik.Masalahnya adalah bahwa dua objek Integer Anda hanya itu, objek. Mereka tidak cocok karena Anda membandingkan dua referensi objek Anda, bukan nilai-nilai di dalamnya. Jelas
.equals
diganti untuk memberikan perbandingan nilai yang bertentangan dengan perbandingan referensi objek.sumber
Integer
merujuk pada referensi, yaitu, ketika membandingkan referensi yang Anda bandingkan jika mereka menunjuk ke objek yang sama, bukan nilai. Oleh karena itu, masalah yang Anda lihat. Alasan itu bekerja sangat baik denganint
tipe polos adalah bahwa itu membuka kotak nilai yang terkandung olehInteger
.Bolehkah saya menambahkan bahwa jika Anda melakukan apa yang Anda lakukan, mengapa harus memiliki
if
pernyataan itu?sumber
"==" selalu membandingkan lokasi memori atau referensi objek dari nilai. sama dengan metode selalu membandingkan nilai. Tetapi equals juga secara tidak langsung menggunakan operator "==" untuk membandingkan nilai.
Integer menggunakan cache Integer untuk menyimpan nilai dari -128 hingga +127. Jika == operator digunakan untuk memeriksa nilai apa pun antara -128 hingga 127 maka itu mengembalikan nilai true. untuk selain nilai-nilai ini mengembalikan false.
Lihat tautan untuk beberapa info tambahan
sumber
Selain itu untuk kebenaran penggunaan,
==
Anda dapat mencopot salah satuInteger
nilai yang dibandingkan sebelum melakukan==
perbandingan, seperti:Yang kedua akan otomatis terbuka (tentu saja Anda harus memeriksa
null
dulu).sumber
Selain jawaban-jawaban luar biasa ini, Yang saya pelajari adalah:
sumber