Integer缓存IntegerCache详解

例子代码

public class IntegerCacheTest {
public static void main(String[] args) {
Integer a=100;
Integer b=100;
System.out.println(a==b);
Integer c=129;
Integer d=129;
System.out.println(c==d);
}
}

运行结果



小朋友你是否有很多问号

源码详解

//缓存以支持 JLS 要求的 -128 到 127(含)值的自动装箱的对象标识语义。缓存在首次使用时初始化。缓存的大小可以由选项 -XX:AutoBoxCacheMax=<size> 控制。在 VM 初始化期间,可以设置 java.lang.Integer.IntegerCache.high 属性并将其保存在 jdk.internal.misc.VM 类的私有系统属性中。警告:缓存使用 CDS 存档,并在运行时从共享存档重新加载。存档缓存 (Integer[]) 和 Integer 对象驻留在封闭的存档堆区域中。更改实现时应小心,并且在初始化后不应为缓存数组分配新的 Integer 对象。
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer[] cache;
static Integer[] archivedCache;
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
h = Math.max(parseInt(integerCacheHighPropValue), 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(h, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h; // Load IntegerCache.archivedCache from archive, if possible
CDS.initializeFromArchive(IntegerCache.class);
int size = (high - low) + 1; // Use the archived cache if it exists and is large enough
if (archivedCache == null || size > archivedCache.length) {
Integer[] c = new Integer[size];
int j = low;
for(int i = 0; i < c.length; i++) {
c[i] = new Integer(j++);
}
archivedCache = c;
}
cache = archivedCache;
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
} private IntegerCache() {}
}
/**
返回表示 Integer 指定 int 值的实例。如果不需要新 Integer 实例,则通常应优先使用此方法而不是构造函数 Integer(int),因为此方法可能会通过缓存频繁请求的值来产生显着更好的空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并且可能会缓存此范围之外的其他值。
参数:
i – 一个 int 值。
返回:
一个 Integer 表示 i的实例。
*/
@IntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

也就是这样说的

如果i >= IntegerCache.low && i <= IntegerCache.high则调用IntegerCache.cache[i + (-IntegerCache.low)]

如果i的值不满足i >= IntegerCache.low && i <= IntegerCache.high则调用new Integer(i)

IntegerCache缓存区间为[-128,127] 所以,在调用Integer.valueOf(int i)方法的时候自动装箱 如果i的值在[-128,127]区间则生成的Integer对象就会被存入缓冲区。当再次对该值进行装箱时会先去缓冲区中获取;如果取到则返回,如果没有取到就创建包装类对象存入缓冲区并返回

当然了除了Integer之外其他的包装类也是有这样的特性的,可以更好地节省内存、提高性能,这应该就是这个特性的出发点吧,而且考虑到了高频的数值的应用场景阔叶树设计的很合理,优化的很好

Integer缓存IntegerCache详解的更多相关文章

  1. integer与int区别以及integer.values()方法详解

    声明:本文为博主转载文章,原文地址见文末. 知识点1:integer和int的区别 /* * int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为 ...

  2. MyBatis 一级缓存、二级缓存全详解(一)

    目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...

  3. 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...

  4. Redis for Windows(C#缓存)配置文件详解

    Redis for Windows(C#缓存)配置文件详解   前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...

  5. nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解

    1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...

  6. PHP缓存机制详解

    一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...

  7. 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项

    <深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面   MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...

  8. 二,PHP缓存机制详解

    一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...

  9. hibernate缓存机制详解

    hiberante面试题—hibernate缓存机制详解   这是面试中经常问到的一个问题,可以按照我的思路回答,准你回答得很完美.首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再 ...

  10. 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图

    1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...

随机推荐

  1. B1002 写出这个数 (20 分)

    描述 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10 100 . 输出格式: 在 ...

  2. LeetCode难度、面试频率、数据结构、算法一览表

    Fightingヾ(๑╹◡╹)ノ"   ID Question Diff(1~5) Freq(1~5) Data Structure Algorithms 1 Two Sum 2 5 arr ...

  3. QPlainTextEdit获取鼠标选中内容

    QPlainTextEdit获取鼠标选中内容 m_plainTextEdit是一个 QPlainTextEdit * 获取选中内容 QString selectStr = m_plainTextEdi ...

  4. obs学习之4——枚举设备、选择设备

    obs学习之4--枚举设备.选择设备

  5. Manim中三种函数图像类的比较

    在 Manim 库中,FunctionGraph.ImplicitFunction 和 ParametricFunction 都是用于绘制函数图像的类,但它们的适用场景.输入形式和实现方式有显著区别. ...

  6. SpringBoot的启动流程扩展点

    阅读说明:1.如果有排版格式问题,请移步https://www.yuque.com/mrhuang-ire4d/oufb8x/yo5ywqt5eudxvxfc?singleDoc#%20%E3%80% ...

  7. FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍

    title: FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍 date: 2025/06/07 08:40:35 updated: 2025/06/07 08:40:35 author: ...

  8. PRIMPERM - Prime Permutations

    将题目分解成两个部分: 判断素数 如果用暴力筛因子的方法,在 $t \le 10^4,n \le 10^7$ 下肯定是要超时的,所以用了时间和空间都比较廉价的埃氏筛法. 代码: bool f[1000 ...

  9. 题解:AT_arc073_d [ARC073F] Many Moves

    题目链接:link. 题意已经挺简易了,直接上思路吧. 我们设 \(f_{i,j}\) 表示当前在第 \(i\) 个时刻,一个棋子在 \(x_i\) 位置,另一个棋子在 \(j\) 位置的最小代价之和 ...

  10. 打工人必备!2025年最强任务管理软件Top5测评推荐

    前言:谁偷走了我们的时间? 你是否也有这样的经历: 今天本来打算写一份PPT,结果临时被拉去开会,文档又拖到了明天: 任务堆成山,却总忘记哪个最重要: 同事催你对接.老板问你进度,你满脑子问号-- 这 ...