划分
class Solution {
    public void fun() {
        Integer a=10;
        Integer b=10;
        System.out.println("a==b  "+(a==b));

        Integer x=128;
        Integer y=128;
        System.out.println("x==y  "+(x==y));

        int k=10;
        System.out.println("a==k  "+(a==k));
        int kk=128;
        System.out.println("x==kk  "+(x==kk));
    }
    public static void main(String[] args) {
        Solution s=new Solution();
        s.fun();
    }
}
运行结果
D:\jianzhi>java Solution
a==b  true
x==y  false
a==k  true
x==kk  true
第一个为什么为true,
Integer自动装箱
首先,直接声明Integer a= 10,会自动装箱变为Integer a = Integer.valueOf(10);(Integer a 会自动拆箱为 a.intValue())。
①、第一个打印结果为 true

对于 i == j ,我们知道这是两个Integer类,他们比较应该是用equals,这里用==比较的是地址,那么结果肯定为false,但是实际上结果为true,这是为什么?

我们进入到Integer 类的valueOf()方法:

分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i = 10 在缓存表示范围内,所以为 true。

②、第二个打印结果为 false

从上面的分析我们知道,128是不在-128到127之间的,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false

③、第三个打印结果为 true

Integer 的自动拆箱功能,也就是比较两个基本数据类型,结果当然为true

④、第四个打印结果为 true

解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。


注:
在写代码的时候发现Integer也有equals方法。那么它和string的equals方法有什么区别呢?

这是Integer的方法源码:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
可以看见是把对比的对象看是不是Integer类型的,是的话就转为int基本类型再用 == 比较,比较的就是数值了。