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

原文地址:开发者导航 · 你想要的,我全都有!

废话不多说,先上题:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发者导航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值