首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

两个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=或 -Djava.lang.Integer.IntegerCache.high=可以设置缓存范围的最大值(包含)。

我们在idea中设置,VM options这一项中加入:-XX:AutoBoxCacheMax=150,将缓存最大值换成150,点击保存后。

重新运行main方法,则程序输出结果就是 true, true。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190814A0E5MQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券