遇到的两个问题(Integer的范围和递归的return)

春节前在验证代码时出现两个问题,虽然都是基础的问题,还是应该记录下来。debug时问题隐藏的比较深,找到具体问题时,却发现是基础问题。

Integer值的判断

Integer定义的两个变量,在if条件中使用了==,虽然算出来的两个值应该是相等的,但是if条件却怎么也没走。查Integer的范围是-128~127之间,在范围内用==是true,在范围外是false。
避免意外,当使用Integer时通过equal来判断是否相等。

这是什么原因呢?
1.java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2.比较的时候仍然是对象的比较
3.在jdk源码中

public static Integer valueOf(int i) { 
  final int offset = 128; 
  if (i >= -128 && i <= 127) { // must cache 
  return IntegerCache.cache[i + offset]; //符合值范围时候,进入也创建好的静态IntergerCache,i+offset的值表示去取cache数组中那个下标的值
  } 
  return new Integer(i); //当不符合-128 127值范围时候。记住用的:new,开辟新的内存空间,不属于IntergerCache管理区
} 

private static class IntegerCache { 
  private IntegerCache(){} 
  static final Integer cache[] = new Integer[-(-128) + 127 + 1]; //开辟-128到127的内存区。有0的位置哦
  static { 
    for(int i = 0; i < cache.length; i++) 
      cache[i] = new Integer(i - 128); //为内存区的数组每个对象赋值
    } 
  } 
} 

这边是java为了提高效率,初始化了-128--127之间的整数对象,所以在赋值在这个范围内都是同一个对象。

再加一句
 Integer a = 100;   a++;   //这边a++是新创建了一个对象,不是以前的对象。

        Integer a = 100;
        Integer b = a;//此时b指针指向值为100的堆地址  即a的堆地址,a==b成立
        a++;//此时a指向的值发生变化为101,a指针指向101的堆地址。而b任然指向100
        System.out.println(a==b);//false
    } 

这部分原文地址为:JAVA Integer值的范围

递归的返回值

不满足条件跳出递归,只是跳出了当前这一层的递归,
还会依次向外层进行递归循环。在调用递归出,加上return,在return处返回到最外层。

            if ((ObjectUtils.isNotEmpty(giftInventoryUse) && giftInventoryUse.getInventory() < 1 ) && counter<= maxNum){
                ++counter ;
                return toDrow(request,lotterys,lotteryConfig,counter);
            }

你可能感兴趣的:(遇到的两个问题(Integer的范围和递归的return))