public class Test { public static void main(String[] args) { Integer iobj1=3; Integer iobj2=3; Integer iobj3=300; Integer iobj4=300; System.out.println(iobj1 == iobj2);//true System.out.println(iobj1.equals(iobj2));//true System.out.println(iobj3 == iobj4);//false System.out.println(iobj3.equals(iobj4));//true } }
Integer的源码可以发现有这么几行代码: if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); 再去看IntegerCache类发现这个数组的值是-128~127,因为300>127所以会new 一个Integer,iobj3、iobj4都是在栈中保存的一串堆的地址,堆里面才是数值300,所以iobj3 == iobj4比较的是栈中的值(堆的地址不同所以结果false),而iobj3.equals(iobj4)对比的是堆中的内容(都是300,返回true)
自动装箱时,-128--127有缓冲池,是同一个对象,如果不在这个范围内,将会新建对象,所以对象会不同。