The Integer
kelas memiliki cache statis, yang menyimpan 256 khusus Integer
benda - satu untuk setiap nilai antara -128 dan 127. Dengan itu dalam pikiran, mempertimbangkan perbedaan antara ketiganya.
new Integer(123);
Ini (jelas) membuat Integer
objek baru .
Integer.parseInt("123");
Ini mengembalikan int
nilai primitif setelah parsing the String
.
Integer.valueOf("123");
Ini lebih kompleks daripada yang lain. Ini dimulai dengan parsing the String
. Kemudian, jika nilainya antara -128 dan 127, itu mengembalikan objek yang sesuai dari cache statis. Jika nilainya di luar kisaran ini, maka new Integer()
nilainya akan memanggil dan meneruskan nilainya, sehingga Anda mendapatkan objek baru.
Sekarang, perhatikan tiga ungkapan dalam pertanyaan.
Integer.valueOf("127")==Integer.valueOf("127");
Ini mengembalikan true, karena Integer
yang nilainya 127 diambil dua kali dari cache statis, dan dibandingkan dengan itu sendiri. Hanya ada satu Integer
objek yang terlibat, jadi ini kembali true
.
Integer.valueOf("128")==Integer.valueOf("128");
Ini kembali false
, karena 128 tidak ada dalam cache statis. Jadi yang baru Integer
dibuat untuk setiap sisi kesetaraan. Karena ada dua Integer
objek yang berbeda , dan ==
untuk objek hanya kembali true
jika kedua sisi adalah objek yang sama persis, ini akan menjadi false
.
Integer.parseInt("128")==Integer.valueOf("128");
Ini membandingkan nilai primitif int
128 di sebelah kiri, dengan objek yang baru dibuat Integer
di sebelah kanan. Tetapi karena tidak masuk akal untuk membandingkan int
dengan Integer
, Java akan membuka kotak secara otomatis Integer
sebelum melakukan perbandingan; sehingga Anda akhirnya membandingkan int
dengan int
. Karena primitif 128 sama dengan dirinya sendiri, ini kembali true
.
.equals()
, jika tidak semua taruhan dibatalkan.