Java中int和Integer的==比较以及装箱和拆箱

1.我们都知道基本类型(int,long邓)通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址
2.当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf()方法也就是自动装箱
直接上代码:

public class TestEquals {
    public static void main(String[] args) {
        int int1 = 12;

        Integer i1 = new Integer(12);
        Integer i2 = new Integer(12);
        Integer i3 = new Integer(127);

        Integer a1 = 127;//相当于 Integer.valueOf(127);
        Integer a2 = 127;

        Integer y = 128;
        Integer z = 128;

        /**
         * true
         * Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型。
         * 所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的。
          */

        System.out.println("int1 == i1 -> " + (int1 == i1));

        /**
         * false
         * 这是两个都是对象类型,而且不会进行拆箱比较,所以不等
         */
        System.out.println("i1 == i2 -> " + (i1 == i2));
        /**
         * false
         * 这个比较好理解
         * i3是新创建的对象,而a1=127会自动装箱调用Integer.valueOf方法返回Integer对象,这个是IntegerCache.cache返回的缓存Integer对象,所以两个对象不相等。
         * 
         */
        System.out.println("i3 == a1 -> " + (i3 == a1));
        /**
         * true
         * 很好理解,都是127 自动装箱,返回的是同一个对象
         */
        System.out.println("a1 == a2 -> " + (a1 == a2));
        /**
         * false
         * 都是128,超过了IntegerCache.high=127,所以返回的都是新创建的Integer对象
         */
        System.out.println("y == z -> " + (y == z));
    }
}

当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。
源码:

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

这里面可以看到,当传递的i的大小在IntegerCache.low~IntegerCache.high之间的时候,是返回的缓存里面的数据。超出范围就是直接创建的一个新的Integer对象。
Integer.java


min-max.jpg

2021-04-19_164240.jpg

由图可知,在Integer类加载的时候会初始化IntegerCache类,从而初始化里面的static {}块,从而初始化IntegerCache.cache[]变量(-128~127)。
总结:int在进行自动装箱的时候,调用了Integer.valueOf方法,当i在-128~127范围内是从IntegerCache中直接获取,当超越这个范围才会new 一个新的Integer对象返回。

你可能感兴趣的:(Java中int和Integer的==比较以及装箱和拆箱)