当前位置: 首页 > news >正文

为什么Integer缓存-128 ~ 127

背景

面试题, 相关问题的考察.
题目大概是, 包装类型Integer == 比较的时候 : -127 ~ 128 是否相等.
其他是否相等?

原理

== 比较的是地址. 如果是不同的对象, 那么就不相等.

实践

下面是几个简单实践.

全部新建对象

解释: 新建对象后, 地址不同, 所以都是false
在这里插入图片描述

不新建对象

暂时的理解: -127 ~ 128 比较的对象的缓存
在这里插入图片描述

一些思考

时间多, 一些灵感

为什么设计这个缓存

HotSpot 团队研究, 90% 以上的整型使用落在 -128~127范围内(2000年代初期数据).
缓存范围 -128~127共 256 个对象 ≈ 4KB 内存(每个 Integer对象约16B)

为什么不多缓存一点

扩大到 -256~255则需 512 对象 ≈ 8KB,收益递减

冷知识: 上限值可以调整

部分源码如下:

// IntegerCache 源码片段(OpenJDK 17)
private static class IntegerCache {static final int low = -128; // 硬编码下限static final int high;static {high = java.lang.Integer.getInteger("java.lang.Integer.IntegerCache.high", 127);// 上限可通过VM参数调整}
}

为什么下限值不能自定义呢?

防止滥用:若允许下限调至 -1,000,000,可能导致缓存占用数百MB内存

其实其他包装类型也有缓存

缓存范围如下:

缓存范围可调性
Integer-128~127仅上限可调
Long-128~127完全不可调
Short-128~127完全不可调
Character0~127(ASCII范围)完全不可调

这个居然也是API?

Integer b = new Integer(100); // ⚠️ 已弃用API

9版本被弃用了: 神奇!

/*** @deprecated* It is rarely appropriate to use this constructor. * Use {@link #valueOf(int)} to take advantage of caching.*/
@Deprecated(since="9")
public Integer(int value) {this.value = value;
}

设计思想

这种设计体现了 Java “80/20法则” 的工程哲学——用最小成本解决大多数问题。

http://www.lryc.cn/news/620442.html

相关文章:

  • 【Linux学习|黑马笔记|Day4】IP地址、主机名、网络请求、下载、端口、进程管理、主机状态监控、环境变量、文件的上传和下载、压缩和解压
  • 编排之神-Kubernetes微服务专题--ingress-nginx及金丝雀Canary的演练
  • [Oracle数据库] ORACLE基本DML操作
  • 图论Day2学习心得
  • Pytest本地插件定制及发布指南
  • 代码随想录Day50:图论(图论理论、深度搜索理论、所有可达路径、广度搜索理论)
  • python sqlite3模块
  • 高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol
  • 《贵州棒球百科》体育赛事排名·棒球1号位
  • 视频号主页的企业信息如何设置?
  • 消费级显卡分布式智能体协同:构建高性价比医疗AI互动智能体的理论与实践路径
  • 从理论到落地:分布式事务全解析(原理 + 方案 + 避坑指南)
  • 云原生存储架构设计与性能优化
  • 【java实现一个接口多个实现类通用策略模式】
  • GitHub 仓库代码上传指南
  • Python包性能优化与并发编程:构建高性能应用的核心技术(续)
  • OpenBMC中C++策略模式架构、原理与应用
  • Qt基本控件
  • Elasticsearch:如何使用 Qwen3 来做向量搜索
  • 设计模式-策略模式 Java
  • 设计模式基础概念(行为模式):策略模式
  • Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)
  • LeetCode 刷题【41. 缺失的第一个正数】
  • linux 主机驱动(SPI)与外设驱动分离的设计思想
  • tomcat 定时重启
  • LeetCode 1780:判断一个数字是否可以表示成3的幂的和-进制转换解法
  • 【Java虚拟机】JVM相关面试题
  • 网页加载缓慢系统排查与优化指南
  • pnpm常用命令;为什么使用pnpm?
  • 【STM32入门教程】stm32简介