装箱与拆箱操作
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 } }
反编译查看具体的运行;