美文网首页
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