Các Integer
lớ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 int
giá 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ì Integer
giá 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ề true
nế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 int
giá 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 int
với một Integer
, Java sẽ tự động bỏ hộp Integer
trước khi thực hiện so sánh; Vì vậy, cuối cùng bạn so sánh một int
vớ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.