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