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

原创
2016/11/29 10:38
阅读数 35

请提供一个对 i,j 的声明,将下面的循环转变为一个无限循环:

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

答案

错解:
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( )中

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 ,前两个会拆箱比数值,!= 会比较对象,所以也成立。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部