装箱与拆箱操做

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

  反编译查看具体的运行;java

 

相关文章
相关标签/搜索