裝箱與拆箱操做

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

 

相關文章
相關標籤/搜索