Integer比較大小問題

看深入理解java虛擬機時候發現下面的代碼比較:

public class TestClass {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 128;
        Integer f = 128;
        Long g = 3L;
        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));
    }
}

上面代碼在不看答案情況下大家可以試着回答一下,下面會貼出答案。在回答問題時候先看幾點關於java“==”和equals方法的總結(大神可以略過),歡迎指正。

  1. 基本數據類型:byte,short,char,int,long,float,double,boolean。他們之間的比較,雙等號(==),比較的是他們的值。
  2. 複合數據類型(類):當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址(確切的說,是堆內存地址)。
  3. 針對第二條需要注意:equals在一些類庫當中這個方法被複寫了,如String、Integer、Date。在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。 所以說,對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內存中的存放位置的地址值。;如果被複寫,按照複寫的要求來。
  4. 常量緩存池緩存-128~127的整數,128是放在堆裏的.
  5. 包裝類的“==”運算在不遇到算數運算的情況下不會自動拆箱,他們的equals方法不處理數據轉型的關係。

上面的答案爲:
true
false
true
true
true
false

下面我們分析上面的結果:(歡迎指正)
1. 對於池c==d和e==f,首先,java中Integer類型對於-128-127之間的數是常量緩存池取的,所以用等號比較是一致的。但對於不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。因此c==d結果是true,e==f結果爲false;
2. 對於第三個c==(a+b),因爲涉及了運算,比較時會進行自動拆箱,實際上是int類型數據在進行比較,比較的爲值,因此結果爲true。
3. 對於c.equals(a+b),Integer的equals方法被重寫了,(源碼其實是對值進行比較),因此結果爲true。
4. 對於g==(a+b),因爲涉及了運算,比較時會進行自動拆箱,實際上就是基本數據類型的比較,因此結果爲true。
5. 對於最後g.equals(a+b),我查看源碼發現,equals方法會判斷是否是相同的類型,a+b的結果不是Long類型,因此equals方法直接返回false。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章