自動裝箱的陷阱

public class test{
public static void main(String [] args){
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;               //個人答案           //正確答案
System.out.println(c == d);//true               true
//包裝類的「==」運算符,在沒有遇到算術運算的時候不會
//進行自動拆箱
System.out.println(e == f);//false              false
//由於「==」後面有算術運算符,因此自動拆箱
System.out.println(c == (a+b));//false          true
System.out.println(c.equals(a+b));//true        true
System.out.println(g == (a+b));//false          true
//基本數據類型的對象的equals方法不會處理數據類型的轉換
//因此g和a+b的數據類型不一樣,不相等
System.out.println(g.equals(a+b));//true        false
}
}
上面這段代碼的class文件進行反編譯獲得以下代碼:
public class test
{


    public test()
    {
    }


    public static void main(String args[])
    {
        Integer a = Integer.valueOf(1);
        Integer b = Integer.valueOf(2);
        Integer c = Integer.valueOf(3);
        Integer d = Integer.valueOf(3);
        Integer e = Integer.valueOf(321);
        Integer f = Integer.valueOf(321);
        Long g = Long.valueOf(3L);
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c.intValue() == a.intValue() + b.intValue());
        System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
        System.out.println(g.longValue() == (long)(a.intValue() + b.intValue()));
        System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
    }
}
相關文章
相關標籤/搜索