从Integer比较引发的一起血案.

某日,javashop的小李在检查代码时,发现了一个比较严重的问题.

笔者看完之后很纳闷,为啥Integer的比较不能用==呢?

我们平时声明一个int类型的a 和一个int类型的b,完全可以使用==来比较,虽然Integer是引用类型,但是他一定是做了什么处理,不然我在比较的时候,为啥得到的结果和预期的时候一致呢?

带着这个疑问,笔者做了一个实验:

两次比较的结果竟然不一样,笔者瞬间就惊了个呆,原来自己的理解一直是错的,实在是愧对老司机这个称号!

但是为什么第一次比较的结果是一样的呢?笔者又做了一次实验,发现在-128到127这个范围之间,使用==比较时结果是相等的,而超出了这个范围,使用==比较往往得不到预期的结果.

一定是做了什么特殊的处理,Integer和其他妖艳贱货的引用类型不一样!

于是笔者仔细查看了Integer源码,发现了这样一段代码:

原来在对Integer进行赋值操作的时候 即Integer a=1时,进行了装箱操作,使用的是上图中的方法.当传入的值在-128-127之间是,会从java的缓冲池获取一个对象.而==符号比较的是引用类型的地址,返回缓冲池对象时,地址相同,所以==会生效.

同样的道理,我们在使用String类型比较的时候

String a=”abc”;

String b=”abc”;

a==b返回的结果同样是true,因为abc也是放入了字符串常量池,使用上述方法赋值时引用地址相同;反之,如果在对Integer赋值时使用

Integer a=new Integer(1);

Integer b=new Integer(1);

a==b的返回结果就变成false啦!

所以在对引用类型进行比较时,应使用equals()方法,而不要使用==符号