IntegerCache的妙用和陷阱!
来源:互联网 发布:淘宝标题关键词测试 编辑:程序博客网 时间:2024/06/03 23:46
考虑下面的小程序,你认为会输出为什么结果?
public class Test {
public static void main(String[] args) {
Integer n1 = 123;
Integer n2 = 123;
Integer n3 = 128;
Integer n4 = 128;
System.out.println(n1 == n2);
System.out.println(n3 == n4);
}
}
答案如下:
true
false
是否和你预想的一致?
我们知道==比较的是对象的引用,那这里为什么会这出这种情况呢?
原理
首先这是JDK在1.5版本中添加的一项新特性,把-128~127的数字缓存起来了,用于提升性能和节省内存。所以这个范围内的自动装箱(相当于调用valueOf(int i)方法)的数字都会从缓存中获取,返回同一个数字,所以现在你理解为什么了吧。同时这也会给我们开发带来预想不到的陷阱,直得注意!!
而我们通过new Integer(1)这样就不会从缓存中获取,大家可以自行测试。
我们来翻看下jdk中Integer的源码
上面是IntegerCache的源码,把从-128~high放在缓存中
上面是valueOf的源码,先从缓存中获取,获取不到再new一个返回
从源码里面我们可以看到最小边界是-128,最大边界可以通过-XX:AutoBoxCacheMax进行配置,但也不会大于Integer.MAX_VALUE最大值。
扩展
这种缓存行为不仅用于Integer类,而且还用于Long,Short,Byte,Character,大家可以去这些类里面查看XxxCache的类和valueOf方法源码,原理大致相同,但它们的边界略有一二,也不能进行最大边界的配置。
- IntegerCache的妙用和陷阱!
- Integer判等的陷阱:你知道Integer内部高速缓冲区IntegerCache吗?
- IntegerCache
- IntegerCache
- 初学者对自动装箱和自动拆箱的认识(IntegerCache的缓存数组)
- &和global的妙用
- js的||和 &&的妙用
- rollup和cube的妙用
- encode和decode的妙用
- InterlockedIncrement和InterlockedDecrement的妙用
- InterlockedIncrement和InterlockedDecrement的妙用
- InterlockedIncrement和InterlockedDecrement的妙用
- struct 和 union的妙用
- onload 和 DOMContentLoaded 的陷阱
- typedef的用途和陷阱
- concat 和 group_concat的陷阱
- 五险一金”的陷阱和奥秘?!
- shared_ptr的使用和陷阱
- @Controller,@Service,@Repository,@Component详解。
- Spring零配置之@Configuration注解详解。
- 一张图搞懂Spring bean的完整生命周期。
- JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)。
- 自定义View (五) 阴影、渐变
- IntegerCache的妙用和陷阱!
- 屌炸天,JDK8的排序大法!!
- 为什么byte取值-128~127??
- 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom
- hashCode到底有什么用?
- E
- java高级应用:线程池全面解析
- 学习java多线程,这必须搞懂的这几个概念,很重要。
- 子午圈和卯酉圈的定义