Java包装类性能优化:深入解析Integer享元模式的源码实现

ops/2025/3/3 5:40:04/

前言

Java中,每一个基本类型都有对应的包装类。其中,Integer作为最常用的包装类之一,其内部实现巧妙地运用了享元模式(Flyweight Pattern),通过对象缓存机制显著提升了性能。本文将深入剖析Integer类的享元模式实现,重点解析valueOf()方法的底层源码。

一、享元模式是什么?

享元模式是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的复用。在Java包装类中,享元模式的核心思想是:

  • 缓存常用对象:对一定范围内的值进行预缓存
  • 减少对象创建:通过复用缓存对象降低内存开销
  • 提升性能:避免频繁的对象创建与垃圾回收

Java中,包装类如Integer便采用了享元模式以缓存常用的整数值,提升性能

Integer_11">二、Integer源码解析

valueOf()方法

Integer类的valueOf()方法是享元模式的核心,它通过缓存机制避免了频繁的对象创建。具体实现如下:

valueOf()方法源码:

java"> @IntrinsicCandidatepublic static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

当调用valueOf()方法时,首先会检查传入的整数是否在缓存的范围内:

  • 在缓存范围内:直接返回缓存中的对象,避免重新创建。
  • 不在缓存范围内:创建新的Integer对象。

IntegerCache_27">IntegerCache类

IntegerCache类实现了缓存机制,缓存了从 -128 到 127 的所有Integer对象。其源码如下:

java">/*** Integer 缓存类(享元模式实现)* 用于缓存常用 Integer 对象,优化内存和性能*/private static class IntegerCache {static final int low = -128;  // 缓存下限static final int high; // 缓存上限(可配置)static final Integer[] cache; // 缓存数组static Integer[] archivedCache; // 从 CDS 归档文件加载的缓存数组(JDK 17 新增)static {int h = 127;  // 默认缓存上限为 127// 尝试读取 JVM 参数配置的缓存上限String integerCacheHighPropValue =VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {// 确保配置值不低于 127h = Math.max(parseInt(integerCacheHighPropValue), 127);// 防止缓存数组大小超过 Integer.MAX_VALUE// 计算逻辑:数组最大长度 = Integer.MAX_VALUE - (-low) -1h = Math.min(h, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// 忽略格式错误(保持默认值 127)}}high = h; // 确定最终缓存上限// 尝试从 CDS 归档文件加载缓存(JDK 17 优化点)CDS.initializeFromArchive(IntegerCache.class);int size = (high - low) + 1;// 动态生成缓存数组的条件:// 1. 归档缓存不存在 或 2. 当前需要的缓存大小 > 归档缓存长度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; // 指向最终缓存数组// 断言确保缓存上限至少为 127(符合 JLS 规范)assert IntegerCache.high >= 127;}// 私有构造方法(防止外部实例化)private IntegerCache() {}
}

如何提高性能?

通过享元模式Integer.valueOf()方法只会创建缓存范围内的对象,而不需要每次都new一个新的Integer对象。这一机制显著降低了内存开销,避免了不必要的垃圾回收。

三、面试题

以下代码会输出什么?

java">public class Main {public static void main(String[] args) {Integer i1 = new Integer(100);Integer i2 = new Integer(100);System.out.println(i1==i2); // false}
}

注意:这里Integer是对象,==比较的是对象的引用,而不是对象的内容。

java">public class Main {public static void main(String[] args) {Integer i1 = 100;  // 自动装箱机制,在底层会自动调用静态方法valueOf的得到一个Integer对象Integer i2 = 100;Integer i3 = 200;Integer i4 = 200;System.out.println(i1==i2); // trueSystem.out.println(i3==i4); // false}
}

补充Integer的常用成员方法
在这里插入图片描述
注意:8中包装类中,除了Character都有对应的parseXxx的方法,进行类型转换


http://www.ppmy.cn/ops/162406.html

相关文章

深拷贝和浅拷贝

一、定义 定义&#xff1a;浅拷贝创建一个新对象&#xff0c;但不复制对象内部的引用指向的对象。复制的是对原始对象内存地址的引用。改变新对象内部的引用所指向的对象会影响原始对象。 定义&#xff1a;深拷贝创建一个新对象&#xff0c;并递归地复制原始对象及其引用的所…

uniapp 系统学习,从入门到实战(五)—— 组件库与常用 UI 组件

全篇大概 7000 字(含代码)&#xff0c;建议阅读时间 30min UniApp 基于 Vue.js 的跨平台特性&#xff0c;提供了丰富的内置组件和灵活的扩展能力。本文将从内置组件、扩展组件库和自定义组件开发三个维度&#xff0c;系统解析 UniApp 的组件生态&#xff0c;并结合实际开发场景…

安科瑞DJSF1352直流电能表在光伏串组箱的应用:提升光伏发电效率与安全的智能利器-安科瑞 耿笠

随着光伏发电技术的快速发展&#xff0c;光伏电站的规模不断扩大&#xff0c;如何高效、安全地管理光伏发电系统成为行业关注的焦点。在光伏发电系统中&#xff0c;光伏串组箱作为连接光伏组件与逆变器的关键设备&#xff0c;其运行状态直接影响整个系统的发电效率和安全性。而…

DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求

DeepSeek 新的 LLM 推理方法 DeepSeek 通过强化学习&#xff08;RL&#xff09;提出了一种创新的改进大规模语言模型&#xff08;LLM&#xff09;推理能力的方法&#xff0c;这在他们最近关于 DeepSeek-R1 的论文中有详细介绍。这项研究代表了在不依赖于大量有监督微调的情况下…

计算机毕业设计SpringBoot+Vue.js在线教育系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

九九乘法表 matlab

J的第一行的1分别乘以I的九列数&#xff0c;就是1的乘法表 1*11 1*22 。。。

leetcode 1472. 设计浏览器历史记录 中等

你有一个只支持单个标签页的 浏览器 &#xff0c;最开始你浏览的网页是 homepage &#xff0c;你可以访问其他的网站 url &#xff0c;也可以在浏览历史中后退 steps 步或前进 steps 步。 请你实现 BrowserHistory 类&#xff1a; BrowserHistory(string homepage) &#xff…

HPE Aruba Networking推出全新解决方案助力零售商增强物联网数据收集与边缘处理能力

全新网络连接解决方案助力IT 团队加强对零售环境的保护与管理,提升物联网(IoT)安全性,同时优化用户体验与运营效率 纽约 — 2025年2月25日 —慧与科技(NYSE: HPE)日前宣布推出全新功能,借助高效的网络连接和高性能边缘计算,助力零售商提升客户体验与运营效率,从而进一步打造零…