装箱与拆箱操作

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
    }
}

  反编译查看具体的运行;

装箱与拆箱操作_第1张图片

 

装箱与拆箱操作_第2张图片

 

你可能感兴趣的:(装箱与拆箱操作)