Java Integer对象使用==对比引起的差异

Integer初始化

1.初始化Integer的时候,可以直接用一个int值赋值

Integer n1 = 11;
Integer n1 = Integer.valueOf(11);

2.当然也可以使用new来创建Integer对象

Integer n2 = new Integer(11);

Integer对象之间的比较

==运算符

Integer n1 = new Integer(11);
Integer n2 = new Integer(11);
Integer n3 = 11;
Integer n4 = 11;
Integer n5 = 200;
Integer n6 = 200;
 
System.out.println(n1 == n2);   //false,两个new的对象
System.out.println(n1 == n3);   //false  n1在堆中,n3指向IntegerCache缓存(方法区中)
System.out.println(n3 == n4);   //true   都指向缓存中同一个对象
System.out.println(n5 == n6);   //false  超出缓存范围,分别是两个new出来的对象

产生上面代码执行结果的原因就是由于IntegerCache的存在,使用第一种方法初始化的对象,如果值的范围在-128~127之间,则相同的值会被包装的同一对象中。 而用new产生的对象肯定不会在同一内存区域。
如果使用==运算符进行比较的话,由于检测的是对象是否指向同一个内存区域,由于初始化时的不确定性,比较的结果也可能不是我们想要的

equals

    public boolean equals(Object obj) {
    
    
        if (obj instanceof Integer) {
    
    
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Integer类重写了object的equals方法,调用时实际比较的是两个对象的值,和对象存储在哪里没有关系。
所以为了保持对象之间比较结果的一致性,同时我们进行比较的初衷应该也是比较它们之间的值,所以使用equals方法。
但是,如果有null值情况,直接使用equals方法,会导出空指针异常,这时候我们可以使用String.valueOf()对Integer值进行转化,然后再使用equals进行对比

Guess you like

Origin blog.csdn.net/qq_28545605/article/details/120016187