天天看點

Integer這個包裝類是個妖孽

給大家出一道小兒科的題:
public class TestInteger {
    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;
        long h = 2L;
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == (a+b));
        System.out.println(c.equals(a+b));
        System.out.println(g == (a + b));
        System.out.println(g.equals(a + b));
        System.out.println(g.equals(a + h));
    }
}
答案是多少呐,你一定在嘀咕這還不簡單呐,答案是      

true

false

如果你這樣想,我隻能說你還太嫩,首先不公布答案呐,最後在公布,先分析分析

1.我們知道在編碼的時候能不用integer就不用這種包裝類,因為它有個裝箱和拆箱的過程,會浪費時間,

2.Integer的緩存範圍大家想必都知道就是-128(-2的7次方)到127(2的7次方-1)超出這個範圍就會在堆中重新配置設定記憶體,是以比較的值超出這個範圍位址就會不一樣

------------------------------------------------------------------------------------

再來說一下==這種運算法的比較,它的比較會先比較位址值,

如果比較的一邊有操作表達式,會比較數值

再來說一下equals

它在比較的時候會優先比較數值

但是Long類型的equals會首先判斷是否屬于Long,

------------------------------------------------------------------

好了公布正确答案

最後一個的解釋是,a+h,a是Integer,h是Long,在進行運算時,會自動轉化為Long類型的進行運算,是以是true

而倒數第二個a+b都是intrger類型的,是以不會進行轉化,是以還是Integer類型的與Long類型沒法比較。

繼續閱讀