Integer是int的封装类,所以在比较相等时一般使用equals,但是如果值在[-128,127]之间会在class常量池中存在,也就是说会放在IntegerCache中,在比较相等时需要注意一下。
有以下几种情况:
Integer a=100
Integer b= 100
那么a==b结果是true,a.equals(b)结果也是true
这里之所以a==b结果为true是因为常量池区间内的数据用的是同一个引用。
Integer a=new Integer(100);
Integer b=new Integer(100);
那么a==b结果是false,a.equals(b)结果是true
这里之所以a==b结果为false因为new 出来的对象不在常量池中,不是同一个引用
Integer a=100
Integer b=new Integer(100);
那么a==b结果是false,a.equals(b)结果是true
这里之所以a==b结果为false因为new 出来的对象不在常量池中,不是同一个引用
int a=150
Integer b =150
那么a==b结果是true,a.equals(b)结果是true
这里a==b为true是因为b进行了拆箱Integer.intValue操作,把Integer转化成了int,属于基本类型比较,封装类型和基本类型比较都会自动拆箱
Integer a =150
Integer b =150
Integer c=new Integer(150);
那么a==b或者a==c结果都为false,a.equals(b)结果是true
这里==比较都为false一方面说明了超出了常量池范围,另一面说明Integer比较是不会拆箱的
总结如下:
两个new 出来的Integer用==比较结果是false;
常量池中非new的两个Integer 用==比较结果为true;
new出来的Integer和int用==比较结果都会为true,因为会对Integer对象进行拆箱。
看似简单的Integer实际上却存在诸多问题,但是大家只要都用equals比较无论如何都不会出问题的,这也是大家都用equals的原因了。
刚刚也提到了拆箱,那你知道如何装箱吗?