java中Integer使用==以及其缓存机制详解

发布于 2024-07-19
1696

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

扫码阅读
手机扫码阅读

Interger值判断问题

本文通过一个问题引入Interger值判断的核心知识点。问题包含三个等值判断:

    Integer minA = -128; Integer minAA = -128;
    System.out.printf("minA=minAA? %s \n", minA == minAA);
    Integer maxA = 127; Integer maxAA = 127;
    System.out.printf("maxA=maxAA? %s \n", maxA == maxAA);
    Integer maxB = 128; Integer maxBB = 128;
    System.out.printf("maxB=maxBB? %s \n", maxB == maxBB);
  

输出结果为:

    minA=minAA? true
    maxA=maxAA? true
    maxB=maxBB? false
  

原因解析

出现上述结果是因为Java中“==”的行为在不同类型间有所不同。对于基本数据类型(如int、byte等),“==”比较的是值,而对于引用类型(如Integer类),则比较的是内存地址。

在上述代码中,maxB==maxBB输出为false,因为它们的内存地址不同。然而,minA==minAA和maxA==maxAA输出为true,这看似矛盾。

深入分析

Java中Integer类有一个特殊的优化机制:为了提高效率,Java将-128到127之间的Integer实例缓存到一个数组中。这意味着,当创建这些范围内的Integer对象时,会直接从缓存中返回,而不是新建对象。这可以通过查看Integer源码验证:

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

因此,minA和minAA共享同一个缓存实例,maxA和maxAA也是如此,所以它们的内存地址相同,比较结果为true。而maxB和maxBB超出了缓存范围,创建了两个不同的实例,导致内存地址不同,比较结果为false。

springboot葵花宝典

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

276 篇文章
浏览 506.6K

还在用多套工具管项目?

一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。

加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线