1. 程式人生 > >Integer比較大小問題

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。