Integer的自动拆箱装箱陷阱

今天看到 @voyage 回了上一个帖子,他给我出了个题,哈哈,一个厉害的陷阱题。留下自己琢磨下的帖子,大家分享下。

  1. Integer i1 = 100;  
  2. Integer i2 = 100;  
  3. Integer i3 = 200;  
  4. Integer i4 = 200;  
  5.   
  6. System.out.println(i1==i2);  
  7. ystem.out.println(i3==i4);  

大家看看这道题,一般人看了第一个输出应该为 true,再想想第二个输出,200跟100有啥区别啊?咋一看,没区别啊,为true?咱们用用心理学想想,既然人家给你出这个题,肯定是问题的,不会这么简单,先选为 false吧(笔试的时候可以使用心理学进行判断,哈哈,这也算一个解决方法)。

下面,我用编译器编译了下,发送输出 :

  1. true  
  2. false  

我对Integer了解也不多啊,果断去看下文档,也没发现什么,其实是我没仔细。。

没办法,问百度谷歌吧。发现是跟 Integer.valuesOf()方法有关,好叻,去看看文档怎么说


偷懒,搞了个中文的...建议大家还是用英文的,正好学学英语。

想必大家看到了吧,缓存机制!!!在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。

然后我去myeclipse中看了下源码:

  1.  public static Integer valueOf(int i) {  
  2.     final int offset = 128;  
  3.     if (i >= -128 && i <= 127) { // must cache   
  4.         return IntegerCache.cache[i + offset];  
  5.     }  
  6.         return new Integer(i);  
  7.     }  

看到原因了吧,哈哈,

当值在-127-128之间,会放在缓存中,方便使用,提高效率,

当值不在 -128 - 127 范围内,它会返回一个新的 Integer,既然是一个新的 Integer,那么内存地址肯定是不同的,所以第二个输出返回的是  false !!



总结: Integer中陷阱,关键是在与它的 valueOf()方法,

    当值在-127-128之间,会放在缓存,可以这么理解放在常量池中,所以对象调用的都是同一个

    当值不在 -128 - 127 范围内,它会返回一个新的 Integer,既然是一个新的 Integer,那么内存地址肯定是不同的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值