"Vì các nhà phát triển có thể đưa ra các lớp mô tả các con số, nên họ quyết định sáng tạo, giống như các nhà phát triển thực thụ."

"Đầu tiên, họ nghĩ ra một lớp Số trừu tượng, từ đó bắt nguồn Byte, Short, Integer, Long, Float và Double. Nó có các phương thức giúp chuyển đổi số thành các loại số khác."

Các phương thức của lớp Number
1
int intValue()
2
long longValue()
3
float floatValue()
4
double doubleValue()
5
byte byteValue()
6
short shortValue()

"Phải. Rốt cuộc, bạn không thể viết cái này:"

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

"Vâng, những loại này không phải là nguyên thủy. Đó là lý do tại sao chúng tôi sử dụng các phương thức của lớp Số:"

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

"Nhưng vẫn còn một vài điều cần xem xét. Bởi vì Integer không phải là một số nguyên, các đối tượng Integer không thể được so sánh với toán tử «==» cổ điển."

So sánh các loại nguyên thủy
int x = 500;
int y = 500;
x == y; //true
So sánh các loại không nguyên thủy
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true

"Chính xác. Bằng cách nào đó tôi đã không nghĩ về điều đó ngay lập tức."

"Nhưng còn nhiều nữa."

"Bạn đang làm chập mạch của tôi! Còn gì nữa không?"

"Khi chúng ta gán một giá trị int cho một biến Integer, phương thức Integer.valueOf được gọi là:"

Mã số Điều gì thực sự xảy ra
Integer x = 5;
Integer x = Integer.valueOf(5);

"Ừ, tôi đã hiểu điều đó từ ví dụ trên."

"Tuy nhiên, hàm valueOf không phải lúc nào cũng tạo đối tượng Số nguyên mới."

"Uh, ý bạn là «không phải luôn luôn»?"

"Nó lưu trữ các giá trị từ -128 đến 127."

Mã số Điều gì thực sự xảy ra Sự miêu tả
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Biến x, y và z chứa các tham chiếu đến các đối tượng khác nhau
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
Các biến x, y và z chứa các tham chiếu đến cùng một đối tượng.
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);
Các biến z và t chứa các tham chiếu đến cùng một đối tượng.

"Nói cách khác, tình huống là thế này:"

1)  Nếu chúng ta viết «new Integer()», thì chắc chắn chúng ta sẽ nhận được một đối tượng mới.

2)  Nếu chúng ta gọi Integer.valueOf(), một cách rõ ràng hoặc thông qua hộp thư tự động, thì phương thức có thể trả về một đối tượng mới hoặc một đối tượng được lưu trong bộ nhớ cache nếu đối số số nằm trong phạm vi từ -128 đến 127.

"Có gì khủng khiếp về phương thức trả về một đối tượng từ bộ đệm?"

"Đừng bận tâm. Bạn chỉ cần biết rằng đôi khi, khi bạn không mong đợi điều đó, các đối tượng có thể bằng nhau. Mọi thứ có sự bình đẳng đều phức tạp. Nếu chúng ta so sánh một nguyên thủy với một không nguyên thủy, thì chúng được so sánh như những nguyên thủy:"

Bài toán so sánh
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)
Một ví dụ thậm chí còn thú vị hơn. Bộ đệm nhập hình ảnh ở đây
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)
Nhưng bộ đệm không liên quan ở đây
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)

"Tuyệt... Và làm thế nào tôi có thể ghi nhớ tất cả những điều này?"

"Bạn không cần phải ghi nhớ điều này. Bạn chỉ cần hiểu tất cả những thứ này được tổ chức như thế nào và điều gì thực sự xảy ra khi một bản sao nguyên thủy và không nguyên thủy của nó phát huy tác dụng."

"Tôi cũng khuyên bạn nên xem các phương thức của lớp Số nguyên. Nó có khá nhiều phương thức hay và hữu ích. Bạn thậm chí đã sử dụng một trong số chúng khá thường xuyên."

"Vâng, tôi nhớ rồi. Integer.parseInt();"