Java基礎_關於integer 128的“==”問題

題外話

首先是Java在1.5後引入了自動拆裝箱

    public static  void main(String[]args){
        Integer intg=1; //裝箱
        int i=intg; //拆箱
    }
實際上那: 

    自動裝箱都是通過包裝類的valueOf()方法來實現的.自動拆箱都是通過包裝類對象的xxxValue()來實現的。

 
    Integer intg=Intg.valueOf(1); 
    int i=intg.intValue(); 

正題:

public static void main(String[]) aa {
 
    Integer integer1 = 127;
    Integer integer2 = 127;
 
    if (integer1 == integer2)
        System.out.println("integer1 == integer2");
    else
        System.out.println("integer1 != integer2");
 
    Integer integer3 = 128;
    Integer integer4 = 128;
 
    if (integer3 == integer4)
        System.out.println("integer3 == integer4");
    else
        System.out.println("integer3 != integer4");
 
}

  輸出:  integer1 == integer2
         integer3 != integer4

爲什麼這樣呢

自動拆裝箱機制提供了一個緩存機制來節省內存和提高性能,Integer對象通過使用相同的對象引用來比較大小,而這個相同的對象就是緩存;即:

  public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

自動裝箱時,如果數字在-128至127之間時,會直接使用緩存中的對象,而不是重新創建一個對象,否則會重新創建對象,

所以之所以Integer對象可以比較值大小,也是比的對象;

但是在比較兩個對象相等時,在上面的範圍內可以“==”,超過就得老老實實“equals”

 

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