架构师

您现在的位置是:首页 > 技术博客 > 编程基础

编程基础

两个Integer类型的数据比较(==),到底是true还是fause?答案未必是你知道的

架构师小跟班 2019-08-14编程基础
一些有经验的同学可能会快就给出答案,但是对一些新手,恐怕会非常犹豫。

废话不多说,先上题:

一些有经验的同学可能会快就给出答案,但是对一些新手,恐怕会非常犹豫。

答案是: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方法,相等条件由业务决定。


文章评论