"Karena pengembang dapat membuat kelas yang menjelaskan angka, mereka memutuskan untuk menjadi kreatif, seperti pengembang sungguhan."

"Pertama, mereka datang dengan kelas Number abstrak, dari mana Byte, Short, Integer, Long, Float, dan Double diturunkan. Ini memiliki metode yang membantu mengubah angka menjadi tipe numerik lainnya."

Metode kelas Number
1
int intValue()
2
long longValue()
3
float floatValue()
4
double doubleValue()
5
byte byteValue()
6
short shortValue()

"Benar. Lagi pula, kamu tidak bisa menulis ini:"

Long x = 100000;
Integer y = (Integer) x;

"Ya, tipe ini bukan primitif. Itu sebabnya kami menggunakan metode dari kelas Number :"

Long x = 100000;
Integer y = x.intValue();

"Tapi masih ada beberapa hal yang perlu dipertimbangkan. Karena Integer bukan int, objek Integer tidak bisa dibandingkan dengan operator «==» klasik."

Membandingkan tipe primitif
int x = 500;
int y = 500;
x == y; //true
Membandingkan tipe non-primitif
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true

"Tepat. Entah kenapa aku tidak langsung memikirkannya."

"Tapi masih ada lagi."

"Kau korslet sirkuitku! Ada apa lagi?"

"Saat kita menetapkan nilai int ke variabel Integer, metode Integer.valueOf disebut:"

Kode Apa yang sebenarnya terjadi
Integer x = 5;
Integer x = Integer.valueOf(5);

"Ya, aku sudah mengerti itu dari contoh di atas."

"Tapi, fungsi valueOf tidak selalu membuat objek Integer baru."

"Uh, apa maksudmu «tidak selalu»?"

"Ini menyimpan nilai dari -128 hingga 127."

Kode Apa yang sebenarnya terjadi Keterangan
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Variabel x, y, dan z berisi referensi ke objek yang berbeda
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
Variabel x, y, dan z berisi referensi ke objek yang sama.
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = 10;
Integer t = 10;
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = Integer.valueOf(10);
Integer t = Integer.valueOf(10);
Variabel z dan t berisi referensi ke objek yang sama.

"Dengan kata lain, situasinya adalah ini:"

1)  Jika kita menulis «Integer baru ()», maka kita dijamin mendapatkan objek baru.

2)  Jika kita memanggil Integer.valueOf(), secara eksplisit atau melalui autoboxing, maka metode tersebut dapat mengembalikan objek baru atau objek yang di-cache jika argumen angka berada dalam rentang dari -128 hingga 127.

"Apa yang mengerikan tentang metode mengembalikan objek dari cache?"

"Tidak apa-apa. Anda hanya perlu tahu bahwa kadang-kadang, ketika Anda tidak mengharapkannya, objek mungkin sama. Segala sesuatu dengan persamaan itu rumit. Jika kita membandingkan primitif dengan non-primitif, maka mereka dibandingkan sebagai primitif:"

Masalah perbandingan
int x = 300;
Integer y = 300;
Integer z = 300;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
Contoh yang lebih menarik. Cache memasukkan gambar di sini
int x = 100;
Integer y = 100;
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
Tetapi cache tidak terlibat di sini
int x = 100;
Integer y = new Integer(100);
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)

"Hebat... Dan bagaimana aku akan mengingat semua ini?"

"Kamu tidak perlu menghafal ini. Kamu hanya perlu memahami bagaimana semua ini diatur dan apa yang sebenarnya terjadi ketika primitif dan rekan non-primitifnya ikut bermain."

"Saya juga merekomendasikan agar Anda melihat metode kelas Integer. Ini memiliki beberapa metode yang bagus dan berguna. Anda bahkan cukup sering menggunakan salah satunya."

"Ya, saya ingat. Integer.parseInt();"