有关Integer的比较问题

首先先给出结论

1、Integer有一个常量池,存放着-128~127之间的数值,在这里的数值在用的时候会从这个缓存中取

2、Integer i = 2,实际上是调用 Integer i = Integer.valueOf(2);

3、Integer和int比较时,会自动拆箱转换为int,基本类型通过==比较大小

4、==号比较的是内存地址,equals比较的值

5、从java1.5开始Integer和int会进行自动拆箱和装箱

6、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);
}
例子1
Integer a1 = new Integer(1);
Integer a2 = new Integer(1);
System.out.println(a1 == a2);  // false
System.out.println(a1.equals(a2)); // true

答:

①为什么==不相等?因为两个Integer是两个不同的对象,地址不同所以false

②为什么equals相等?因为equals比较的是值

下面是equals源码

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
例子2
Integer a1 = 2;
Integer a2 = 2;
Integer b1 = 222;
Integer b2 = 222;
System.out.println(a1 == a2);               //true
System.out.println(b1 == b2);               //false
System.out.println(a1.equals(a2));          //true
System.out.println(b1.equals(b2));          // true

答:

①为什么a1== a2为true,b1==b2为flase

因为在Integer中存在一个常量池会把再-128-127之间的数都放置进去,在下次使用时会直接调用常量池中的数,如果不存在则会调用new Integer(int i)所以b1和b2表面上是相同的数,但实际上调用了两次new Integer()

②两个equals为什么相等

因为equlas比较的值的大小

例子3
Integer a1 = new Integer(2);
Integer a2 = 2;
System.out.println(a1 == a2);   //false
System.out.println(a1.equals(a2));  // true

答:

①为什么a1 == a2是false,因为a1是对象所以两者不相等

例子4
Integer a1 = new Integer(2);
int a2 = 2;
System.out.println(a1 == a2);  //true

答:

①为什么a1 == a2,因为会调用拆箱把Integer转换为int,从而比较值(和Integer的缓冲池无关)

猜你喜欢

转载自blog.csdn.net/m0_37564531/article/details/88386427