循環者的詛咒(包裝類拆裝箱問題)

請提供一個對 i,j 的聲明,將下面的循環轉變爲一個無限循環:

while (i <= j && j <= i && i != j) {}

答案java

錯解:
Integer i = 0;
Integer j = 0;
正解:
Integer i = new Integer(0);
Integer j = new Integer(0);

解答:緩存

運算操做符  <  ,  >  , <= , >=  進行時,若是有包裝類,會轉換成基本數據類型(拆箱)再比較。
!=  ,  ==   比較的是對象的reference。

錯解中,聲明 i , j 時,實際過程是 Integer i = Integer.valueOf(0);(裝箱) Integer的方法valueOf( )中code

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

private static class IntegerCache{
    private IntegerCache(){ }
    static final integer cache[] = new Integer[-(-128)+127+1];
    static{
        for(int i = 0; i< cache.length; i++)
        cache[i] = new Integer(i-128)
    }
}

java爲了提升效率,在IntegerCache類中緩存了一組從-128到127的Integer對象。 因此,這個範圍內的int值若進行了包裝,則變量指向的是同一個對象。因此 i!=j 不成立。對象

正解中,i 和 j 是兩個new 出來的對象。i <= j && j <= i && i != j ,前兩個會拆箱比數值,!= 會比較對象,因此也成立。class

相關文章
相關標籤/搜索