Integer a= 127,Integer b = 127;Integer c= 128,Integer d = 128;,相等吗?

答案是 a 和 b 相等,c 和 d 不相等。

  • 对于基本数据类型的比较,使用 == 比较的是它们的值。
  • 对于引用数据类型的比较,使用 == 比较的是它们的地址。

在给 Integer 赋值时,如果赋值的整数在范围 -128 到 127 之间,会使用 Integer 缓存池中的对象,否则会创建新的 Integer 对象。

    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        Integer b1 = new Integer(127);
        System.out.println(a == b); //true
        System.out.println(b==b1);  //false

        Integer c = 128;
        Integer d = 128;
        System.out.println(c == d);  //false
    }

什么是 Integer 缓存?

因为根据实践发现大部分的数据操作都集中在值比较小的范围,因此 Integer 搞了个缓存池,默认范围是 -128 到 127,可以根据通过设置JVM-XX:AutoBoxCacheMax=来修改缓存的最大值,最小值改不了。

实现的原理是 int 在自动装箱的时候会调用 Integer.valueOf,进而用到了 IntegerCache。

javase-19.png

很简单,就是判断下值是否在缓存范围之内,如果是的话去 IntegerCache 中取,不是的话就创建一个新的 Integer 对象。

IntegerCache 是一个静态内部类, 在静态块中会初始化好缓存值。

 private static class IntegerCache {
     ……
     static {
            //创建Integer对象存储
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
         ……
     }
 }

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题