全栈小白的gravatar头像
全栈小白 2023-03-15 14:47:51
java包装类隐藏的小知识,你了解吗

原创声明:本人所发内容及涉及源码,均为亲手所撸,如总结内容有误,欢迎指出

首先来看段代码

java包装类隐藏的小知识,你了解吗

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

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

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

那下面我们来一探究竟

java包装类隐藏的小知识,你了解吗

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

我们在执行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是什么?

java包装类隐藏的小知识,你了解吗

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

java包装类隐藏的小知识,你了解吗

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

java包装类隐藏的小知识,你了解吗

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

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

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

总结一下:

1、byte、short、int、long对应的包装类都会有一个缓存,范围在-128-127之间,会优先返回缓存中的值,否则才会new

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


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
流水本无情  LV9 3月13日
stedian  LV4 2023年12月20日
yuyiyuyi  LV6 2023年8月2日
全栈小白  LV34 2023年3月18日
最代码官方  LV167 2023年3月18日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友