Integer x=127;
Integer y=127;
Integer m=9999;
Integer n=9999;
System.out.println("x==y:"+(x==y)); //true
System.out.println("m==n:"+(m==n)); //false
System.out.println("x.equals(y):"+x.equals(y)); //true
System.out.println("m.equals(n):"+m.equals(n)); //true
可以发现,==比较,较小的两个相同的Integer返回true,较大的两个相同的Integer返回false,这是因为Integer内部已经把-128~+127在缓存池中已经创建好了。所以,编译器把Integer x = 127;自动变为Integer x = Integer.valueOf(127);就可以直接使用缓存池中的127,从而节省内存;但是如果超过了这个范围,内存将要分配新的空间。所以,基于缓存池的存在,Integer.valueOf()对于-128~+127之间的数字,始终返回相同的实例。
对两个Integer实例进行比较要特别注意:绝对不能用==比较,因为Integer是引用类型,必须使用equals()比较。