之前一直以为,这只是一道纯粹的面试题,然而和同事一起跟踪问题,却发现产线因此有雷~ 所以就整理一下
Integer a = 0 ;
Integer b = 0;
System.out.println(a==b);//true
Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1==b1);//false
然而这时为啥呢?反编译了一下class文件
所以幺蛾子就出现在Integer.valueOf()方法中
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是一个静态内部类,IntegerCache.low=-128 IntegerCache.high = 127,所以当-128-127时,直接返回的是IntegerCache.cache 中的同一个对象,而不在这个范围时返回的是new出来的对象
产线上出现问题的是 :
Integer allnum = mybatis.findA();
Integer count = mybatis.findB();
if(allnum == count ){} 这个时候,allnum > 127 所以比较的是两个不同的对象,所以是false!
注:这个时候时mybatis查询的返回奥!到底是返回的int 还是 通过valueOf 有待考究!
而产线大多数据查询结果是<=127的所以问题一直没有暴露出来,万分尴尬!
Integer a2 = new Integer("0");
Integer b2 = new Integer("0");
System.out.println(a2==b2);//false
System.out.println(a2==0);//true
//这是为什么呢?反编译解析出来是System.out.println(a2.intValue() == 0); 进行了拆箱
//而常用的equals的源码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
//也是进行了拆箱