【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,欢迎您的加入!

猜你喜欢

转载自blog.csdn.net/admin_2022/article/details/130414150