【Java】Java中200 != 200?

首先来看段代码

image-20230315135154294

为什么100就相等,200就不相等了,看了上述结果,您是否也有这疑问,那下面小白就带大家了解一下

首先我们需要知道,引用数据类型 == 是在比什么?

引用数据类型实际是存在于堆内存当中,==比较的实际是其内存地址

那下面我们来一探究竟

image-20230315140656243

我们先来看一下代码的字节码指令,简单说一个,其他的类似

我们在执行Integer intA = 100; 时JVM执行了3条指令,意思是首先加载一个100的常量,调用Integer的valueOf方法,将其结果存入局部变量表的第二个槽位(注意哈返回值是一个Integer,结果就是引用数据类型的地址,并不是真实值),那么重点就转移到了Integer.valueOf()方法上面,我们来看一看

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

以上便是Integer.valueOf()的源码,首先是个判断,如果i在low与high之间,就调用IntegerCache.cache()返回,否则就new Integer()

那我们来看一看low与high是什么?

image-20230315141415793

两个静态变量,虽然high没有显式的赋值,但是在静态内部类中赋值了,分别是-128,127,那刚好我们的100和200一个在其中,一个不在,那么我们再看IntegerCache.cache()是个什么东西

image-20230315141856330

看这里,cache是一个静态变量,数组类型,在类加载的时候就已经赋值了,长度为256,通过循环赋值为-128-127,可以理解为是一个缓存

image-20230315142120653

那我们重新解释这里,如果i的值在-128-127之间,直接从缓存中获取,否则new Integer()

那么intA与intB的值为100,其实都是cache中的值,是同一个地址,所以是相等的

intC与intD的值为200,重新new了两个Integer,地址肯定不一样啦

结语

1、制作不易,一键三连再走吧,您的支持永远是我最大的动力!

2、Java全栈技术交流Q群:941095490,欢迎您的加入!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈小白.

感谢老板,祝老板今年发大财!

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

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

打赏作者

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

抵扣说明:

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

余额充值