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

发布于 2024-07-19
882

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

扫码阅读
手机扫码阅读

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==minAAmaxA==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);
    }
  

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

springboot葵花宝典