Việc gán trực tiếp một ký tự int cho một tham chiếu Số nguyên là một ví dụ về tự động đóng gói, trong đó giá trị ký tự thành mã chuyển đổi đối tượng được trình biên dịch xử lý.
Vì vậy, trong giai đoạn biên dịch trình biên dịch chuyển đổi Integer a = 1000, b = 1000;
thành Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Vì vậy, nó Integer.valueOf()
thực sự là phương thức cung cấp cho chúng ta các đối tượng số nguyên và nếu chúng ta nhìn vào mã nguồn của Integer.valueOf()
phương thức, chúng ta có thể thấy rõ ràng phương thức lưu trữ các đối tượng số nguyên trong phạm vi -128 đến 127 (bao gồm).
/**
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Vì vậy, thay vì tạo và trả về các đối tượng số nguyên mới, Integer.valueOf()
phương thức này sẽ trả về các đối tượng Số nguyên từ bên trong IntegerCache
nếu int nghĩa đen được truyền lớn hơn -128 và nhỏ hơn 127.
Java lưu trữ các đối tượng số nguyên này bởi vì phạm vi số nguyên này được sử dụng rất nhiều trong lập trình hàng ngày, gián tiếp tiết kiệm một số bộ nhớ.
Bộ nhớ đệm được khởi tạo trong lần sử dụng đầu tiên khi lớp được tải vào bộ nhớ do khối tĩnh. Phạm vi tối đa của bộ đệm có thể được kiểm soát bằng -XX:AutoBoxCacheMax
tùy chọn JVM.
Hành vi bộ nhớ đệm này không áp dụng cho các đối tượng Integer chỉ, tương tự như Integer.IntegerCache chúng tôi cũng có ByteCache, ShortCache, LongCache, CharacterCache
cho Byte, Short, Long, Character
tương ứng.
Bạn có thể đọc thêm bài viết của tôi về Java Integer Cache - Tại sao Integer.valueOf (127) == Integer.valueOf (127) là True .