Integer i = 42;
 Long l = 42l;
 Double d = 42.0;

为true的是

l.equals(42L)

自动装箱,将 42L 装箱成 Long 类型,所以调用 equals 方法时,类型相同,且值也相同,因此返回真

1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

int a = 220;
 Integer b = 220;
 System.out.println(a==b);//true

2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

Integer c=3;
 Integer h=3;
 Integer e=321;
 Integer f=321;
 System.out.println(ch); //true
 System.out.println(ef); //false

3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。

Integer a=1;
 Integer b=2;
 Integer c=3;
 System.out.println(c.equals(a+b));//true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

int i=1;
 int j = 2;
 Integer c=3;
 System.out.println(c.equals(i+j));//true

包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱(基本数据类型包装类在进行算术运算时会自动拆箱,比如两个Integer相加时,两个Integer会拆箱为int,相加结果为int。)

基本数据类型会自动装箱,equals方法只有对象才有,所以使用equals必须先包装(包装类的equals()方法不处理数据转型)。

==比较的是地址,equals比较的是value。
==是在同一类型的基本类与包装类之间才会发生自动拆包比较(如Integer 与int,Long与long进行 ==比较时,会自动拆箱),equals不会对比较的数据类型进行转换
不同类型之间进行比较,如果有一方为非包装类,则会自动拆箱。如果两方都为包装类,则不会拆箱,且不能比较,编译会报错 (不同类型引用的 == 比较,会出现编译错误,不能比较)。

基本数据类型和包装类的比较

  1. 只要== 号左右两边存在基本数据类型,那么必然是值比较,一边如果是包装类,包装类需要拆箱。同时这种比较,存在基本数据类型的自动向上转型,但是需要注意的是,浮点型由于精度的问题,比较的时候最好别用==。
  2. 包装类之间的比较(只要类型不同,肯定返回false,类型相同,才会判断值):
    1. 使用==号:先判断类型,再判断引用地址。Integer中的***数组,这个在比较Integer的时候需要被注意一下。
    2. 使用equals方法:先判断类型,再判断值。但是不提供类型转换。

包装类的equals都重写

Long覆写equals的java源码

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

Integer覆写equals的java源码

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

类中对equals重写的源码:会先用instanceof比较是否属于该类,如果不属于,直接返回false~

Float和Double和Integer还有Long类似,但是Float和Double较为复杂,特别Float。所以不是一个类型的,equals直接返回false。
而==如果是同一个类型,会自动拆箱。l.equals(42L),这里是42L自动装箱成Long类型,而不是l被自己拆箱了。

基本数据类型的==不是比较地址。
java中的数据类型,可分为两类:

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。

2.复合数据类型(类)
当用 == 进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号 == 进行比较的,所以比较后的结果跟双等号(==)的结果相同。