The Integerkelas memiliki cache statis, yang menyimpan 256 khusus Integerbenda - satu untuk setiap nilai antara -128 dan 127. Dengan itu dalam pikiran, mempertimbangkan perbedaan antara ketiganya.
new Integer(123);
Ini (jelas) membuat Integerobjek baru .
Integer.parseInt("123");
Ini mengembalikan intnilai 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 Integeryang nilainya 127 diambil dua kali dari cache statis, dan dibandingkan dengan itu sendiri. Hanya ada satu Integerobjek 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 Integerdibuat untuk setiap sisi kesetaraan. Karena ada dua Integerobjek yang berbeda , dan ==untuk objek hanya kembali truejika kedua sisi adalah objek yang sama persis, ini akan menjadi false.
Integer.parseInt("128")==Integer.valueOf("128");
Ini membandingkan nilai primitif int128 di sebelah kiri, dengan objek yang baru dibuat Integerdi sebelah kanan. Tetapi karena tidak masuk akal untuk membandingkan intdengan Integer, Java akan membuka kotak secara otomatis Integersebelum melakukan perbandingan; sehingga Anda akhirnya membandingkan intdengan int. Karena primitif 128 sama dengan dirinya sendiri, ini kembali true.
.equals(), jika tidak semua taruhan dibatalkan.