原文地址:开发者导航 · 你想要的,我全都有!
废话不多说,先上题:
一些有经验的同学可能会快就给出答案,但是对一些新手,恐怕会非常犹豫。
答案是: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=<size>或 -Djava.lang.Integer.IntegerCache.high=<high>可以设置缓存范围的最大值(包含)。
我们在idea中设置,VM options这一项中加入:-XX:AutoBoxCacheMax=150,将缓存最大值换成150,点击保存后。
重新运行main方法,则程序输出结果就是 true, true。
总结
1)==:当比较的是基本数据类型时,比较的是值;当比较的是引用数据类型时,比较的是地址值。
2)equals:equals不能用于基本数据类型的比较;当比较的是引用数据类型时,默认也是比较地址值,只不过像String、Date、File、包装类等都重写了Object类中的equals方法,重写后比较的不再是两个对象的地址值,而是自定义的相等标准(可以是某一个或某几个属性值相等)。在实际项目开发中,常常需要重写equals方法,相等条件由业务决定。