装箱与拆箱操作
package main;
/**
* @author zhaozihui
* @date 2019/6/24
*/
public class LongTest {
public static void main(String[] args) {
Long longVal =2L; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;-->自动装箱
Integer i1 = 1;//Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;-->自动装箱
Integer i2 =1;// Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;-->自动装箱
System.out.println(longVal.equals(i1+i2));//false
//为什么会出现false呢?
/**
* i1+i2--> // Method java/lang/Integer.intValue:()I --->先 拆箱操作,进行相加运算
* Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;--->然后将 相加的结果重新装箱成为Integer对象
*
* Long.equals:(Ljava/lang/Object;)--->最终的比较是Long和Integer进行的比较,
* 但是equals的源码:
* public boolean equals(Object obj) {
* if (obj instanceof Long) {
* return value == ((Long)obj).longValue();
* }
* return false;
* }
* */
Object o = new Object();
System.out.println(o instanceof Long);//false
// 所以最终longVal.equals(i1+i2) false的原因不是值的问题,而是类型不匹配直接返回了false
}
}
反编译查看具体的运行;



浙公网安备 33010602011771号