day03-Integer与int的比较

1.Integer 与 int的区别

1)、Integer 是int的包装类(相当于引用数据类型),int是8种基本数据类型之一。

2)、Integer的默认值是nul;int默认值是0。

2.Integer与int的比较   常见的 == 地址的比较

1)、Integer 是一个引用类型,实际上是要有一个Integer对象的,所以通过new产生的两个Integer变量永远是不相等的,new的两个地址是不一样的。

Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b);//false,两个new出来的对象地址一定不同

2)、Integer与int比较时,会有一个自动拆箱的过程。因为Integer类型与基本数据类型int比较时,java会将Integer自动拆箱成int类型比较,所以两个的值相等的时候,就视为相等的。(注意:非new产生的Integer跟new产生的Integer都会自动拆箱)

int a = 10;
Integer b = 10;
Integer c = new Integer(10);
System.out.println(a == b);//true,非new的Integer自动拆箱成int
System.out.println(a == c);//true,new的Integer也会自动拆箱成int

3)、两个非new产生的Integer比较。(有坑有陷阱)。这里在一定的范围内(-128--127)两个非new的Integer的变量只要值相等,比较结果就是true,这是Integer包装类的缓存机制,这个范围的上限可以更改(只有Integer的范围可以更改)其他包装类的范围是固定的不能更改。

(坑:)如果超过了这个范围(-128---127),那么会重新给你返回一个新的Integer。两者都new Integer();那地址肯定不同。

Integer b = 10;
Integer c = 10;
System.out.println(b == c);//true 在缓存范围之内 没有问题
        
Integer d = 150;//实际上是调用valueOf方法。在这方法中就有范围,-128-127才可以缓存
Integer e = 150;
System.out.println(d == e);//flase超出了缓存范围,两个就都new Integer(150),肯定不等

源码:

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

4)、非new产生的Integer与new 产生的Integer比较。非new产生的Integer变量指向的是java的常量池中的对象,而new产生的是在堆中创建的对象。两者地址肯定不同。

Integer a = 10;//指向java常量池中的对象
Integer b = new Integer(10);//指向堆中的对象
System.out.println(a == b);//flase 两者地址不同

猜你喜欢

转载自www.cnblogs.com/zhiai007/p/9319766.html