两个 Integer 对象比较大小,为什么 100 等于 100,1000不等于 1000 ?
考察点
Integer是我们在开发中经常用的包装类,对其基础的理解非常的重要,这个问题就是面试官想考察我们是不是平日里善于积累,仔细思考这方面的知识!
关于这个问题,我的回答如下:
1.我们看一下具体的例子:
public boolean xxx(Integer a,Integer b){
...
if(a==b){
return true;
}
...
return false;
}
a和b输入100,返回的结果是true
a和b输入1000,返回的结果是false
在上面的代码中,当我们输入a,b都是100的时候,结果是true,但是a,b是1000的时候就报false了,这是怎么回事呢?
2.查看源码Integer的valueof方法:
public final class Integer extends Number implements Comparable<Integer>{
...
public static Integer valueOf(int i){
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
}
通过源码可以看到IntegerCache.cache、和IntegerCache.low、IntegerCache.high在
对数据结果进行影响。
IntegerCache.low 的值为-128而IntegerCache.high 的值为127。
也就是说如果目标值在-128~127 之间,会直接从 cache 数组中取值,否则就会新建对象。为什么是-128~127呢?原因是-128~127 的数据在 int 范围内是使用最频繁的,为了减少频繁创建对象带来的内存消耗,这里其实是用到了享元模式,以提高空间和时间性能。