今天看到 @voyage 回了上一个帖子,他给我出了个题,哈哈,一个厉害的陷阱题。留下自己琢磨下的帖子,大家分享下。
- Integer i1 = 100;
- Integer i2 = 100;
- Integer i3 = 200;
- Integer i4 = 200;
- System.out.println(i1==i2);
- ystem.out.println(i3==i4);
大家看看这道题,一般人看了第一个输出应该为 true,再想想第二个输出,200跟100有啥区别啊?咋一看,没区别啊,为true?咱们用用心理学想想,既然人家给你出这个题,肯定是问题的,不会这么简单,先选为 false吧(笔试的时候可以使用心理学进行判断,哈哈,这也算一个解决方法)。
下面,我用编译器编译了下,发送输出 :
- true
- false
我对Integer了解也不多啊,果断去看下文档,也没发现什么,其实是我没仔细。。
没办法,问百度谷歌吧。发现是跟 Integer.valuesOf()方法有关,好叻,去看看文档怎么说
偷懒,搞了个中文的...建议大家还是用英文的,正好学学英语。
想必大家看到了吧,缓存机制!!!在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
然后我去myeclipse中看了下源码:
- public static Integer valueOf(int i) {
- final int offset = 128;
- if (i >= -128 && i <= 127) { // must cache
- return IntegerCache.cache[i + offset];
- }
- return new Integer(i);
- }
看到原因了吧,哈哈,
当值在-127-128之间,会放在缓存中,方便使用,提高效率,
当值不在 -128 - 127 范围内,它会返回一个新的 Integer,既然是一个新的 Integer,那么内存地址肯定是不同的,所以第二个输出返回的是 false !!
总结: Integer中陷阱,关键是在与它的 valueOf()方法,
当值在-127-128之间,会放在缓存,可以这么理解放在常量池中,所以对象调用的都是同一个
当值不在 -128 - 127 范围内,它会返回一个新的 Integer,既然是一个新的 Integer,那么内存地址肯定是不同的。