Integer ==问题

首先看一下几个例子:

public class TestInteger {

    public static void main(String[] args) {
        Integer a=100;
        Integer b=100;
        Integer a1=1000;
        Integer b1=1000;

        Integer a0=new Integer(100);
        Integer b0= new Integer(100);

        System.out.println(a==b);
        System.out.println(a1==b1);
        System.out.println(a0==b0);

        System.out.println(a.equals(b));
        System.out.println(a1.equals(b1));
        System.out.println(a0.equals(b0));
    }


}

运行结果:

true
false
false
true true true

 

当我们声明类似Integer a = 100;的时候,它实际上在内部做的是:

Integer i = Integer.valueOf(100);

valueOf() 方法,我们可以看到

public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache\[i + (-IntegerCache.low)\];
      return new Integer(i);
    }

如果值的范围在 - 128 到 127 之间,它就从高速缓存返回实例。

所以…Integer a = 100, b= 100; 指向了同一个对象。

如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。

Integer a0=new Integer(100);

Integer中不是有范围是:-128-127的缓存吗?为什么是false?

先看看Integer的构造方法:它其实并没有用到缓存。那么缓存是在哪里用的?答案在valueOf方法中。

我们要养成良好编码习惯,尽量少用==判断两个Integer类型数据是否相等,只有在上述特殊的场景下才相等。而应该改成使用equals方法判断

posted @ 2022-10-12 15:28  Nausicaa0505  阅读(57)  评论(0编辑  收藏  举报