在Java编程中,Integer类作为基本范例int的包装器,提供了对象化的操作和主动装箱与拆箱的功能。从JDK5开始引入了一项特殊的优化步伐——Integer缓存机制,它对于提升步伐性能和镌汰内存消耗具有重要意义。接下来我们由一段代码去打开Integer缓存机制的秘密。- public static void main(String[] args) {
- Integer i1 = 100;
- Integer i2 = 100;
- System.out.println(i1 == i2);
- Integer i3 = 1000;
- Integer i4 = 1000;
- System.out.println(i3 == i4);
- }
复制代码 至于答案是什么呢?我们接着往下看,等你看完就明白了。
当你在你的Idea中写出这段代码的时间,Idea就会提示你要利用equals()方法区比力大小,由于Integer是对象,对象的值比力要用equals()方法,而不是利用==,这里我们主要是研究一下Integer的缓存机制。
Integer缓存是什么
Java的Integer类内部实现了一个静态缓存池,用于存储特定范围内的整数值对应的Integer对象。默认环境下,这个范围是-128至127。当通过Integer.valueOf(int)方法创建一个在这个范围内的整数对象时,并不会每次都生成新的对象实例,而是复用缓存中的现有对象。我们看一下Integer.valueOf(int)的源码:- @HotSpotIntrinsicCandidate
- public static Integer valueOf(int i) {
- if (i >= IntegerCache.low && i <= IntegerCache.high)
- return IntegerCache.cache[i + (-IntegerCache.low)];
- return new Integer(i);
- }
复制代码 IntegerCache类在Java虚拟机启动时创建了一个固定大小的数组,用于缓存指定范围内所有的Integer对象。这样在后续步伐运行过程中,对于这些范围内的整数进行装箱操作时,可以直接从缓存中获取已存在的对象,以提升性能并镌汰内存开销。同时,它也提供了根据体系属性(-Djava.lang.Integer.IntegerCache.high)来自定义缓存上限的本领,并确保满意Java语言规范关于小整数主动装箱共享的规定。
在Integer.value(int)方法中,如果int的值在IntegerCache返回的low和high之内,则直接返回IntegerCache中缓存的对象,否则重新new一个新的Integer对象。
而文章开头示例中,我们利用Interge i1 = 100的方式其实是Java的主动装箱机制,整数字面量100是一个基本范例的int值。当赋值给一个Integer引用变量i时,编译器会隐式地调用Integer.valueOf(int)方法将这个基本范例的int值转换为Integer对象。
整数在编程中经常被利用,特殊是在循环计数等场景中,通过缓存整数对象,可以大幅度镌汰相同整数值的对象创建,从而减小内存占用。
由此我们可以看出由于100在[-128, 127]之内,所以i1 == i2打印true,而1000不在[-128, 127]之内,所以i3 == i4打印false。
我们尝试利用java.lang.Integer.IntegerCache.high调解一下high为1000,然后看一下效果:
打印结果都是true。
当然这个上限不要随意去调解,调解之前,需要仔细评估应用步伐的实际需求和性能影响。尽量选择在[-128, 127]范围内的整数值,以充实利用Integer缓存机制。
留意事项
- 比力: 由于缓存的存在,在-128至127之间的Integer对象在进行==运算符比力时,结果大概是true,由于它们指向的是同一个内存地址。而在缓存范围之外创建的Integer对象即使值相等,也会视为不同的对象,因此利用==比力会返回false。不论是否启用缓存,对于任何两个Integer对象,只要其包含的整数值相同,调用equals()方法始终会返回true。所以我们在比力对象时肯定要利用equals()方法。
- 不适用于所有场景: 当利用new Integer(i)直接创建Integer对象时,不会利用缓存。
- 不要随意去扩展缓存的上下限
总结
Integer缓存机制是Java中的一项性能优化步伐,通过缓存肯定范围内的整数对象,既能减小内存开销,又能进步性能。
本文已收录于我的个人博客:码农Academy的博客,专注分享Java技术干货,包括Java基础、Spring Boot、Spring Cloud、Mysql、Redis、Elasticsearch、中间件、架构设计、面试题、步伐员攻略等
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |