Khi bạn biên dịch một số bằng chữ trong Java và gán nó cho một Integer (viết hoa I
), trình biên dịch sẽ phát ra:
Integer b2 =Integer.valueOf(127)
Dòng mã này cũng được tạo khi bạn sử dụng hộp thư tự động.
valueOf
được triển khai sao cho một số số nhất định được "gộp" và nó trả về cùng một thể hiện cho các giá trị nhỏ hơn 128.
Từ mã nguồn java 1.6, dòng 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Giá trị của high
có thể được cấu hình thành giá trị khác, với thuộc tính hệ thống.
-Djava.lang.Integer.IntegerCache.high = 999
Nếu bạn chạy chương trình của mình với thuộc tính hệ thống đó, nó sẽ xuất ra đúng!
Kết luận rõ ràng: không bao giờ dựa vào hai tham chiếu giống hệt nhau, luôn so sánh chúng với .equals()
phương thức.
Vì vậy, b2.equals(b3)
sẽ in đúng cho tất cả các giá trị logic bằng nhau của b2, b3.
Lưu ý rằng Integer
bộ đệm không có ở đó vì lý do hiệu năng, mà là để tuân thủ JLS, phần 5.1.7 ; nhận dạng đối tượng phải được cung cấp cho các giá trị -128 đến 127.
Số nguyên # valueOf (int) cũng ghi lại hành vi này:
phương pháp này có khả năng mang lại hiệu suất không gian và thời gian tốt hơn đáng kể bằng cách lưu trữ các giá trị được yêu cầu thường xuyên. Phương pháp này sẽ luôn lưu trữ các giá trị trong phạm vi -128 đến 127, bao gồm và có thể lưu trữ các giá trị khác ngoài phạm vi này.