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

为什么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.xdnf.cn/news/17943.html

相关文章:

  • 学习设计模式《二十二》——职责链模式
  • 搭建 Docker 私有仓库
  • springboot项目不同平台项目通过http接口AES加密传输
  • UE5配置MRQ编解码器输出MP4视频
  • 机器人“ChatGPT 时刻”倒计时
  • 电池模组奇异值分解降阶模型
  • 两种方法实现,本地部署Qwen-Image,并开放API服务
  • MyBatis学习总结(六)
  • 高并发内存池 性能瓶颈分析与基数树优化(9)
  • vLLM(Vectorized Large Language Model Serving) 的深度解析
  • C++ 应用场景全景解析:从系统级到AI的跨越式演进
  • GaussDB数据库架构师修炼(十六) 如何选择磁盘
  • jetson orin nx(8G)烧录super系统实录
  • 亚马逊手工制品分类体系革新:从流量重构到运营升级的深度解析
  • Wireshark中常见协议
  • WriteBooster
  • 解决安装 scikit-learn==1.3.1 时出现的版本匹配错误
  • MixOne在macOS上安装碰到的问题
  • SpringMVC请求与响应
  • FPGA读取AHT20温湿度模块思路及实现,包含遇到的问题(IIC协议)
  • Opencv 边界填充 图像运算 阈值处理 和图像平滑处理
  • 【Linux基础知识系列】第九十四篇 - 如何使用traceroute命令追踪路由
  • 【从零开始学习Redis】项目实战-黑马点评D1
  • 【代码随想录day 20】 力扣 538.把二叉搜索树转换为累加树
  • 计算机网络---传输控制协议Transmission Control Protocol(TCP)
  • 数据结构之顺序表相关算法题
  • Qt---Qt函数库
  • 西门子PLC通过稳联技术EtherCAT转Profinet网关连接baumuller伺服器的配置案例
  • Java基础 8.14
  • linux中的dump命令