2019java面试题系列——————2.Integer ==比较大小问题

public classCompare {    
    public static voidmain(String[] args) {      
         Integer a1 = 110;
         Integer a2 = 110;
         Integer a3 = 160;
         Integer a4 = 160;
         System. out.println( a1 == a2);//true
         System. out.println( a3 == a4);//false
    }
}

当我们给Integer 赋值int类型的时候会自动装箱成了Integer,执行了

Integer a1 = Integer.valueOf(110);

Integer a2= Integer.valueOf(110);

Integer a3= Integer.valueOf(160);

Integer a4= Integer.valueOf(160);

那么我们思考一下为什么执行==会一个返回true、一个返回false呢,我们来看看Integer.valueOf(110)的源码

public staticInteger valueOf(inti) { 
    if(i >= IntegerCache.low&& i <= IntegerCache.high) 
        returnIntegerCache.cache[i + (-IntegerCache.low)];
    return newInteger(i);

}

首先我们来看看low、和high的值,初始为-128、127

从上面我们可以知道给Interger 赋予的int数值在-128 - 127的时候,直接从cache中取出引用,这些cache引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,所以就不一样了。

public classCompare { 
    public static voidmain(String[] args) { 
        Integer a1 = 110;
        Integer a2 = 110;
        Integer a3 = 160;
        Integer a4 = 160;
        System. out.println( a1 == a2);//true
        System. out.println( a3 == a4);//false
        Integer a5=10;
        Integer a6=newInteger(10);
        Integer a7=127;
        Integer a8=127;
        System.out.println(a5==a6);//false
        System.out.println(a7==a8);//true
    }
}

代码解读:因为 a7 和 a8在-128-127这个范围内指向的是同一个引用,所以==也是true,而new Integer()方法则重写开辟了内存空间,所以==结果为false

基本类型:比较的是值是否相同。

引用类型:比较的是引用是否相同。

参考文献

猜你喜欢

转载自blog.csdn.net/u012197505/article/details/88367020