今天突然发现一个特别有意思的事,就是使用java的Integer的比较出现一个问题,就是使用 ==(引用的比较),并没有获取到我们想要的结果
一、== 和 equals的区别
我们知道Java有两种类,一种是原始类,例如int,long等,还有包装类Integer,Long等,在比较原始类时我们使用 ==
来比较,比较的是值,比较包装类时使用 equals
来比较值,用 ==
比较引用,这些我们都是知道的,但是今天发现的有点颠覆我的三观。
二、== 的比较
例子如下
public static void main(String... strings) {
Integer integer1 = Integer.valueOf(3);
Integer integer2 = Integer.valueOf(3);
if (integer1 == integer2) {
System.out.println("integer1 == integer2");
} else {
System.out.println("integer1 != integer2");
}
Integer integer3 = Integer.valueOf(500);
Integer integer4 = Integer.valueOf(500);
if (integer3 == integer4) {
System.out.println("integer3 == integer4");
} else {
System.out.println("integer3 != integer4");
}
}
比较的结果:
integer1 == integer2
integer3 != integer4
结果并不是我认为的都是false
是发生了bug了吗,我去看了源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
从这里我们可以看出值的取值方式是从缓存里取得,默认区间是-128到127.从这里可以看出值是从缓存的列表里去,值相同时引用也是一样,当超出这个范围时才会创建新对象。
所以这里的坑需要记住。
参考文档 :http://www.codeceo.com/article/java-integer-cache.html