Vì autoboxing không gọi new Integer(...) mà gọi Integer.valueOf(int), và method này trả về object lấy từ cache với các giá trị nhỏ.
java
Integer a = 127, b = 127;
System.out.println(a == b); // true - same cached instance
Integer c = 128, d = 128;
System.out.println(c == d); // false - two distinct objects
System.out.println(c.equals(d)); // true - compares values- JLS 5.1.7 bắt buộc cache cho
boolean,byte,chartrong\u0000–\u007f, vàshort/inttrong -128..127. Trong dải này, hai lần boxing cùng giá trị phải cho cùng một object. - Ngoài dải,
valueOfcấp phát object mới →==(so sánh tham chiếu) trả về false. - Cận trên của cache
Integerchỉnh được bằng-XX:AutoBoxCacheMax=<n>(java.lang.Integer.IntegerCache.high).
Quy tắc: không bao giờ dùng == với wrapper type. So sánh bằng equals(), hoặc gán về primitive int rồi mới so sánh. Lỗi này hay lộ ra khi mã chạy đúng ở môi trường test (id nhỏ) và sai ở production (id lớn).