Integer和int基本类型的比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25673113/article/details/78108699

先看几行代码

        Integer a1 = 100;
        Integer a2 = 100;
        System.out.println("a1==a2:" + (a1 == a2));

        Integer b1 = 200;
        Integer b2 = 200;
        System.out.println("b1==b2:" + (b1 == b2));

        Integer c1 = new Integer(100);
        Integer c2 = new Integer(100);
        System.out.println("c1==c2:" + (c1 == c2));

        int d1 = 100;
        Integer d2 = new Integer(100);
        System.out.println("d1==d2:" + (d1 == d2));

a1==a2:true
b1==b2:false
c1==c2:false
d1==d2:true

大家的答案是否和显示的相同呢,如果和你想象的不同,那又是为什么会产生这种情况呢?

包装类型

这里我们重复什么是包装类型,什么是基本类型了。
包装类型的解释:

  1. 当我们对两个基本类型进行比较时,JVM是直接比较他们的他们的值
        int a = 10;
        int b = 10;
        System.out.println(a == b);//true
  1. 当我们对两个包装类型比较时,JVM通过比较他们的地址来判断是否是同一个对象。例如下面的而例子,c1和c2都是new出来的新对象,因此c1==c2的值肯定不同,他们只是拥有相同value值的Integer对象。
        Integer c1 = new Integer(100);
        Integer c2 = new Integer(100);
        System.out.println("c1==c2:" + (c1 == c2));//false
  1. 当我们对两个包装类型比较时,还有一种情况,就是不通过new来创建Integer,而是通过JVM自动把int基础类型转换成Integer对象(下面称为封包)。如以下例子:

        Integer a1 = 100;
        Integer a2 = 100;
        System.out.println("a1==a2:" + (a1 == a2));//true
    
        Integer b1 = 200;
        Integer b2 = 200;
        System.out.println("b1==b2:" + (b1 == b2));//false

    为什么两个几乎一样的代码结果不同呢?让我们来看下JVM的指令操作:

In1.png

从上图可以看出,在封包的过程中其实就是调用了Integer.valueOf()方法把int基本类型转换成了Integer对象。

 public static Integer valueOf(int i) {
        //IntegerCache.low=-128,IntegerCache.high=127
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

在valueOf方法中对i进行了判断,如果在[-128,127]之间会从缓存中取出相应的Integer对象,而不是重新new一个Integer对象,所以当我们比较100的时候是返回的true,而200则是返回的是false。
4. 当我们把一个Integer和一个int对象比较时,是通过从Integer取出value和int值比较

int d1 = 100;
Integer d2 = new Integer(100);
System.out.println("d1==d2:" + (d1 == d2));

int2.png

猜你喜欢

转载自blog.csdn.net/qq_25673113/article/details/78108699
今日推荐