包装类缓存对象

news/2025/3/1 6:01:23/

在 Java 中,包装类(如 IntegerLongCharacter 等)为了提高性能和节省内存,对一定范围内的值进行了缓存。这种缓存机制使得在某些情况下,相同的值会返回相同的对象,而不是创建新的对象。

1. 包装类缓存机制

  • 缓存范围
    • Integer:默认缓存 -128127 之间的值。
    • Long:默认缓存 -128127 之间的值。
    • Character缓存 0127 之间的值。
    • Byte缓存所有可能的值(-128127)。
    • Short:默认缓存 -128127 之间的值。
    • Boolean缓存 truefalse
  • 缓存实现

2. 示例:Integer缓存机制

  • 缓存范围内的值
    • -128127 之间的值会返回相同的对象。
  • 缓存范围外的值
    • 超出缓存范围的值会创建新的对象。

代码示例:

java">public class IntegerCacheExample {public static void main(String[] args) {Integer a = 127; // 使用缓存Integer b = 127; // 使用缓存System.out.println(a == b); // trueInteger c = 128; // 超出缓存范围,创建新对象Integer d = 128; // 超出缓存范围,创建新对象System.out.println(c == d); // false}
}

输出:

true
false

3. 修改 Integer缓存范围

  • 通过 JVM 参数调整缓存范围
    • 可以通过 -XX:AutoBoxCacheMax=<size> 参数调整 Integer缓存上限。
  • 示例
    • 缓存范围扩大到 -128200

运行命令:

java -XX:AutoBoxCacheMax=200 IntegerCacheExample

代码示例:

java">public class IntegerCacheExample {public static void main(String[] args) {Integer a = 200; // 使用缓存Integer b = 200; // 使用缓存System.out.println(a == b); // true}
}

输出:

true

4. 其他包装类缓存机制

  • Long 缓存机制
    • 默认缓存 -128127 之间的值。

代码示例:

java">public class LongCacheExample {public static void main(String[] args) {Long a = 127L; // 使用缓存Long b = 127L; // 使用缓存System.out.println(a == b); // trueLong c = 128L; // 超出缓存范围,创建新对象Long d = 128L; // 超出缓存范围,创建新对象System.out.println(c == d); // false}
}

输出:

true
false

代码示例:

java">public class CharacterCacheExample {public static void main(String[] args) {Character a = 127; // 使用缓存Character b = 127; // 使用缓存System.out.println(a == b); // trueCharacter c = 128; // 超出缓存范围,创建新对象Character d = 128; // 超出缓存范围,创建新对象System.out.println(c == d); // false}
}

输出:

true
false

5. 缓存机制的意义

  • 性能优化
    • 缓存机制避免了频繁创建和销毁对象,提高了性能。
  • 节省内存
    • 对于常用的小范围值,直接使用缓存对象可以减少内存占用。
  • 注意事项
    • 在比较包装类对象时,应使用 equals() 方法而不是 ==,因为 == 比较的是对象的引用,而不是值。

代码示例:

java">public class WrapperComparison {public static void main(String[] args) {Integer a = 128;Integer b = 128;System.out.println(a == b); // falseSystem.out.println(a.equals(b)); // true}
}

输出:

false
true

6. 自定义包装类缓存

  • 如果需要实现自定义包装类缓存机制,可以参考 IntegerCache 的实现方式。
  • 示例:自定义一个 MyInteger 类,并实现缓存机制。

代码示例:

java">public class MyInteger {private int value;private static final MyInteger[] cache = new MyInteger[256];static {for (int i = 0; i < cache.length; i++) {cache[i] = new MyInteger(i - 128);}}private MyInteger(int value) {this.value = value;}public static MyInteger valueOf(int value) {if (value >= -128 && value <= 127) {return cache[value + 128];}return new MyInteger(value);}@Overridepublic boolean equals(Object obj) {if (obj instanceof MyInteger) {return this.value == ((MyInteger) obj).value;}return false;}@Overridepublic String toString() {return Integer.toString(value);}
}public class MyIntegerCacheExample {public static void main(String[] args) {MyInteger a = MyInteger.valueOf(127); // 使用缓存MyInteger b = MyInteger.valueOf(127); // 使用缓存System.out.println(a == b); // trueMyInteger c = MyInteger.valueOf(128); // 超出缓存范围,创建新对象MyInteger d = MyInteger.valueOf(128); // 超出缓存范围,创建新对象System.out.println(c == d); // false}
}

输出:

true
false

总结

包装类缓存机制是 Java 中一种重要的性能优化手段,适用于常用的小范围值。在使用包装类时,应注意以下几点:

  1. 了解缓存范围,避免不必要的对象创建。
  2. 在比较包装类对象时,使用 equals() 方法而不是 ==
  3. 可以通过 JVM 参数调整 Integer缓存范围。
  4. 如果需要,可以参考包装类缓存机制实现自定义缓存

http://www.ppmy.cn/news/1575700.html

相关文章

基于 Python 开发在线多人游戏服务器案例解析

基于 Python 开发在线多人游戏服务器案例解析 本文详细介绍基于 Python 开发在线多人游戏服务器的案例。通过阐述服务器架构设计、网络通信实现、玩家管理以及游戏逻辑处理等方面&#xff0c;展示 Python 在网络应用开发中的强大能力&#xff0c;为游戏开发者和网络编程爱好者…

开源模型应用落地-glm模型小试-glm-4-9b-chat-vLLM集成(四)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…

批量将 Word 转换为 PDF/Excel/Txt/图片等多种格式

Word 文档是我们工作中经常会打交道的一种文档格式&#xff0c;我们也经常会有需要对 Word 文档进行格式转换的需求&#xff0c;比如将 Word 格式转换为 PDF、将 Word 文档转换为 Excel、将 Word 文档转换为 txt 等等。如果只是单个的文档格式转换&#xff0c;处理起来很简单&a…

「JVS更新日志」低代码、企业会议、智能BI、智能排产2.26更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&…

从 0 到 1:使用 Docker 部署个人博客系统

引言 在当今数字化时代&#xff0c;拥有一个个人博客来记录自己的学习、生活和见解是一件非常有意义的事情。然而&#xff0c;传统的博客部署方式往往涉及复杂的环境配置和依赖管理&#xff0c;容易让人望而却步。而 Docker 的出现&#xff0c;为我们提供了一种简单、高效的解…

C#学生管理系统 进阶(通过接口,继承接口的类,实现接口约束_对List中存储的数据进行排列)

using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Xml.Linq;namespace _3.List学生管理系统 {internal class Program{static List<Student> l…

Java中的@JSONField注解详解:用法、场景与实践

目录 1. 注解引入 2. 常用属性及用法 2.1 name 属性 2.2 format 属性 2.3 serialize 和 deserialize 属性 2.4 ordinal 属性 3. 使用场景 3.1 数据交互 3.2 数据安全 3.3 日期格式化 4. 实践注意事项 JSONField 是阿里巴巴开源的 JSON 处理库 FastJSON 提供的一个注…

【小游戏】C++控制台版本俄罗斯轮盘赌

制作团队&#xff1a;洛谷813622&#xff08;Igallta&#xff09; 989571&#xff08;_ayaka_&#xff09; Mod&#xff1a;_ayaka_ 双人模式&#xff1a;Igallta 公告&#xff1a; 原先的9.8改名为 Alpha 1.0&#xff0c;以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…