java中Integer使用==以及其缓存机制详解
发布于 2024-07-19
882
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
springboot葵花宝典
扫码关注公众号
扫码阅读
手机扫码阅读
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葵花宝典
springboot葵花宝典
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
springboot葵花宝典的其他文章
从瀑布到敏捷:深入持续集成与Jenkins的探索
从瀑布到敏捷:深入持续集成与Jenkins的探索
SpringSecurity自定义Security认证过滤器
SpringSecurity自定义Security认证过滤器
SpringSecurity-12-Redis实现基于session共享登录方案
SpringSecurity-12-Redis实现基于session共享登录
Spring-1-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发
今日目标 掌握纯注解开发依赖注入(DI)模式,学习使用纯注解进行第三方Bean注入
SpringBoot-葵花宝典源码地址
SpringBoot葵花宝典源码地址
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线