Các Integerlớp học có một bộ nhớ cache tĩnh, mà các cửa hàng 256 đặc biệt Integerđối tượng - một cho tất cả các giá trị trong khoảng -128 và 127. Với ý nghĩ đó, hãy xem xét sự khác biệt giữa ba.
new Integer(123);
Điều này (rõ ràng) làm cho một Integerđối tượng hoàn toàn mới .
Integer.parseInt("123");
Điều này trả về một intgiá trị nguyên thủy sau khi phân tích cú pháp String.
Integer.valueOf("123");
Điều này phức tạp hơn những người khác. Nó bắt đầu bằng cách phân tích cú pháp String. Sau đó, nếu giá trị nằm trong khoảng từ -128 đến 127, nó sẽ trả về đối tượng tương ứng từ bộ đệm tĩnh. Nếu giá trị nằm ngoài phạm vi này, thì nó sẽ gọi new Integer()và chuyển vào giá trị, để bạn có được một đối tượng mới.
Bây giờ, hãy xem xét ba biểu thức trong câu hỏi.
Integer.valueOf("127")==Integer.valueOf("127");
Điều này trả về true, bởi vì Integergiá trị của nó là 127 được lấy hai lần từ bộ đệm tĩnh và so với chính nó. Chỉ có một Integerđối tượng liên quan, vì vậy điều này trở lại true.
Integer.valueOf("128")==Integer.valueOf("128");
Điều này trả về false, vì 128 không có trong bộ đệm tĩnh. Vì vậy, một cái mới Integerđược tạo ra cho mỗi bên của sự bình đẳng. Vì có hai Integerđối tượng khác nhau và ==đối với các đối tượng chỉ trả về truenếu cả hai bên là cùng một đối tượng, điều này sẽ xảy ra false.
Integer.parseInt("128")==Integer.valueOf("128");
Đây là so sánh intgiá trị nguyên thủy 128 ở bên trái, với một Integerđối tượng mới được tạo ở bên phải. Nhưng vì không có ý nghĩa gì khi so sánh intvới một Integer, Java sẽ tự động bỏ hộp Integertrước khi thực hiện so sánh; Vì vậy, cuối cùng bạn so sánh một intvới một int. Vì 128 nguyên thủy bằng chính nó, điều này trả về true.
.equals(), nếu không tất cả các cược đã tắt.