美文网首页
Integer和int基本类型的比较

Integer和int基本类型的比较

作者: lkj41110 | 来源:发表于2017-09-27 02:18 被阅读14次

先看几行代码

        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。

  1. 当我们把一个Integer和一个int对象比较时,是通过从Integer取出value和int值比较
       int d1 = 100;
       Integer d2 = new Integer(100);
       System.out.println("d1==d2:" + (d1 == d2));
int2.png

相关文章

网友评论

      本文标题:Integer和int基本类型的比较

      本文链接:https://www.haomeiwen.com/subject/lhalextx.html