java 文件缓存_让人疑惑的Java代码

我们先看一段代码,很简单对不对

4f4607bd2e2c93d11b639e37e0914c2a.png

执行一下:

2f592de218402aba32f598c09f5f4716.png

和大多数人心里想的不一样吧,好多人还在纠结,到底是全是true还是全是false呀。

然而一个是true,一个是false,这是为什么呢?

有的人根本不去思考,直接打开百度搜索去查找答案(一个个都是百度首席软件工程师)

根据Java编译机制,.java文件在编译以后会生成.class文件给JVM加载执行,于是找到.class文件,反编译看了一下,发现编译器在编译我们的代码时,很调皮(聪明的)的在我们声明的变量加上了valueOf方法 ,代码变成了如下:

febec76dabc0daf43c01131ec231ad19.png

看一下valueOf方法的实现

40f6996cbfcd9d18a41fd5d94bafed53.png

我们发现,Integer的作者在写这个类时,为了避免重复创建对象,对Integer值做了缓存,如果这个值在缓存范围内,直接返回缓存好的对象,否则new一个新的对象返回,那究竟这个缓存到底缓存了哪些内容呢?看一下IntegerCache这个类:

bd8ca5903b34ef1bad795dc206f018f9.png

这是一个内部静态类,该类只能在Integer这个类的内部访问,这个类在初始化的时候,会去加载JVM的配置,如果有值,就用配置的值初始化缓存数组,否则就缓存-128到127之间的值。

再来看看我们之前的代码:

9c83bfa907dc40728024159eb25330d4.png

结论:我们在比较两个Integer对象的值时,无论是怎么声明的,都一定要使用equals去比较,不能用==,在Java中没有重载操作符这一说,特别是从其它语言转到Java的童鞋们要注意。equals我在其它文章里已经做了详细解说。

654a9c66ab08aad9b5fa10fc51910965.png

思考以下代码的执行结果:

924d731c34e15f1863ed379950f800b1.png

下一篇:Java字符串那些事儿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值