Integer n = 111在编译时会被编译成 Integer n = Integer.valueOf(111)
Integer.valueOf()方法会从IntegerCache.cache[]数组方法里获取缓存对象
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
在内部类IntegerCache里的静态代码块为IntegerCache.cache[]数组添加了-128~127的Integer对象,当Integer.valueOf(-128~127)的值时会从IntegerCache.cache[]数组中获取,所以
Integer.valueOf(111) == Integer.valueOf(111) 是同一个对象
即:Integer m = 111;Integer n = 111;(m == n) == true
不在-128~127范围内则会重新new Integer(128)对象
new Integer(128) != new Integer(128) 是两个不同对象