天天看点

Integer是int的封装类,所以在比较相等时一般使用equals,但是如果值在[-128,127]之间会在class

作者:架构师风吹哨

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的原因了。

刚刚也提到了拆箱,那你知道如何装箱吗?

Integer是int的封装类,所以在比较相等时一般使用equals,但是如果值在[-128,127]之间会在class
Integer是int的封装类,所以在比较相等时一般使用equals,但是如果值在[-128,127]之间会在class
Integer是int的封装类,所以在比较相等时一般使用equals,但是如果值在[-128,127]之间会在class

继续阅读