废话不多说,先上题:
一些有经验的同学可能会快就给出答案,但是对一些新手,恐怕会非常犹豫。
答案是:true,false
为什么呢?
内容创业服务平台
一般人会说:Integer缓存了-128到127之间的整数对象。
那为什么会缓存呢?
如果面试官问你,你能回答出缓存这一步,面试官会比较满意,但是如果你能说出缓存的原因,那面试官就会对你刮目相看!在默认情况下,Integer确实缓存了-128到127之间的整数对象,但有些情况例外。
分析
为什么会缓存?最直接的办法就是看源码,我们知道声明整数时,会通过 java.lang.Integer#valueOf(int) 构造。在这个类的最上面定义了两个变量:
static final int low = -128;static final int high = 127;
通过源码和注释可以看到,如果是-128到127之间的整数,则会使用整数缓存对象,否则就new一个整数型对象。
因此第一个是true,第二个是false。
为什么会调用valueOf(int)这个方法呢?
我们直接反汇编看一下。
第一步:生成class文件
cd D:\Gitee\spider-server\src\main\java\com\provy\spiderserver\test
javac Demo.java
第二步:反汇编
可以看到四个Integer对象的构造使用了java/lang/Integer.valueOf函数。
我们继续看 java.lang.Integer.IntegerCache的源码
可以看到,通过设置虚拟机参数:XX:AutoBoxCacheMax=或 -Djava.lang.Integer.IntegerCache.high=可以设置缓存范围的最大值(包含)。
我们在idea中设置,VM options这一项中加入:-XX:AutoBoxCacheMax=150,将缓存最大值换成150,点击保存后。
重新运行main方法,则程序输出结果就是 true, true。
领取专属 10元无门槛券
私享最新 技术干货