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