两个 Integer 对象比较大小,为什么 100 等于 100,1000不等于 1000 ?

两个 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 范围内是使用最频繁的,为了减少频繁创建对象带来的内存消耗,这里其实是用到了享元模式,以提高空间和时间性能。

猜你喜欢

转载自blog.csdn.net/weixin_45817985/article/details/133063935