循环者的诅咒(包装类拆装箱问题)

请提供一个对 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

相关文章
相关标签/搜索