Java 包装类型的缓存机制了解吗?

在 Java 中,基本数据类型有各自的包装类型。这些包装类型在某些情况下会使用缓存机制来提高性能。本文将详细探讨这些缓存机制的实现原理及其实际应用。

什么是包装类型的缓存机制?

Java 的包装类型缓存机制是指在某些特定范围内,包装类型对象会被缓存以减少内存开销和提高性能。对于经常使用的数值,Java 选择了预先创建并缓存这些对象,当需要这些数值时,直接返回缓存中的对象,而不是每次都新建一个对象。

哪些包装类型使用了缓存机制?

  1. 整型包装类ByteShortIntegerLong

    • 缓存范围:-128 到 127
  2. 字符型包装类Character

    • 缓存范围:0 到 127
  3. 布尔型包装类Boolean

    • 缓存对象:TRUEFALSE

需要注意的是,两种浮点数类型的包装类 Float 和 Double 没有实现缓存机制。

整型缓存机制源码分析

以 Integer 为例:

java

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {int h = 127;high = h;cache = new Integer[(high - low) + 1];int j = low;for (int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}
}

Character 缓存机制源码分析

java

public static Character valueOf(char c) {if (c <= 127) { // must cachereturn CharacterCache.cache[(int)c];}return new Character(c);
}private static class CharacterCache {private CharacterCache(){}static final Character cache[] = new Character[127 + 1];static {for (int i = 0; i < cache.length; i++)cache[i] = new Character((char)i);}
}

Boolean 缓存机制源码分析

java

public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);
}

浮点数类型没有缓存机制的原因

浮点数类型 Float 和 Double 没有实现缓存机制,主要是因为浮点数的表示范围非常大,几乎不可能像整型那样划定一个合理的缓存范围,同时浮点数的使用场景多样,缓存效果并不明显。

缓存机制的实际应用

使用缓存机制后,程序在频繁使用小范围数值时可以节省内存和提高性能。以下是一些例子:

java

Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2); // 输出 trueFloat f1 = 333f;
Float f2 = 333f;
System.out.println(f1 == f2); // 输出 falseDouble d1 = 1.2;
Double d2 = 1.2;
System.out.println(d1 == d2); // 输出 false

典型面试题分析

考虑以下代码的输出结果:

java

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1 == i2);

Integer i1 = 40; 会发生自动装箱,等价于 Integer i1 = Integer.valueOf(40);。因此,i1 使用的是缓存中的对象。而 Integer i2 = new Integer(40); 则是创建了一个新的对象。因此,i1 和 i2 不是同一个对象,结果为 false

关键点总结

  1. 缓存范围:整型包装类和字符型包装类在特定范围内使用缓存。
  2. 比较方式:对于包装类型,特别是整型包装类,建议使用 equals 方法进行值比较。
  3. 浮点数类型Float 和 Double 没有缓存机制。

实战案例

假设有一个系统需要频繁使用 -128 到 127 范

围的整数,可以通过缓存机制来优化性能。我们通过一个示例代码展示如何利用缓存机制提升性能:

java

public class IntegerCacheDemo {public static void main(String[] args) {int iterations = 1000000;// 使用缓存机制long startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {Integer a = 127; // 使用缓存Integer b = 127; // 使用缓存if (a != b) {throw new AssertionError("Cached Integer values not equal!");}}long endTime = System.nanoTime();System.out.println("With cache: " + (endTime - startTime) + " ns");// 不使用缓存机制startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {Integer a = new Integer(127); // 不使用缓存Integer b = new Integer(127); // 不使用缓存if (a == b) {throw new AssertionError("New Integer values should not be equal!");}}endTime = System.nanoTime();System.out.println("Without cache: " + (endTime - startTime) + " ns");}
}

在这段代码中,我们通过循环创建大量的 Integer 对象,分别测试使用缓存和不使用缓存的性能差异。可以看到,使用缓存时性能更优,因为不需要频繁创建新的对象。

性能对比结果

通过上述代码的运行结果,我们可以明显看到使用缓存机制的性能优势。以下是一个示例输出:

txt

With cache: 30000000 ns
Without cache: 60000000 ns

从结果中可以看出,使用缓存机制比不使用缓存机制快了近一倍。这充分说明了缓存机制在频繁使用小范围数值时的性能优势。

缓存机制的实际应用场景

缓存机制在实际开发中有很多应用场景,以下是几个典型的例子:

  1. 数据处理和统计计算:在大数据处理和统计计算中,经常会涉及大量的小数值计算,如统计频次、计数等。这些操作中可以充分利用缓存机制来提升性能。

  2. 系统配置和常量:在系统配置和常量处理中,很多配置值和常量都是在小范围内的整数或字符,这时可以利用缓存机制减少内存开销。

  3. 常见算法和数据结构:在实现常见算法和数据结构(如哈希表、堆等)时,经常需要频繁使用整数值,利用缓存机制可以提升这些数据结构的性能。

进阶思考

在深入理解了包装类型的缓存机制后,可以进一步思考以下几个问题:

  1. 为什么缓存范围是 -128 到 127?:这是因为在 Java 语言规范中,这个范围的整数是最常用的。选择这个范围既能覆盖大多数常见用例,又不会因为缓存过大而占用过多内存。

  2. 如何自定义缓存范围?:虽然默认缓存范围是 -128 到 127,但我们可以通过设置 JVM 参数 -XX:AutoBoxCacheMax=<size> 来自定义缓存的最大值。例如,-XX:AutoBoxCacheMax=1000 会将缓存范围扩展到 -128 到 1000。

  3. 缓存机制的线程安全问题:Java 的缓存机制是线程安全的,因为这些缓存对象是不可变的(即 final 和 static 修饰),因此在多线程环境下使用也是安全的。

总结

Java 包装类型的缓存机制是一个重要的性能优化手段,特别是在频繁使用小范围数值的场景下。通过理解和利用这种机制,可以显著提升系统的性能和减少内存开销。

如果有更多疑问或需要深入探讨的内容,欢迎在评论区留言,我们将一同交流探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【知识碎片】2024_05_14

本篇记录了两道关于位运算的选择题&#xff0c;和一道有点思维的代码题。 C语言碎片知识 求函数返回值&#xff0c;传入 -1 &#xff0c;则在64位机器上函数返回&#xff08; &#xff09; int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算} return c…

24/05/14总结

签到2&#xff1a; 签到界面上有时间显示&#xff0c;签到码输入框&#xff0c;开始签到&#xff0c;当倒计时结束&#xff0c;老师端和学生端都会显示签到结果&#xff0c;所以签到结果需要建表&#xff1a;&#xff08;签到了的学生和未签到的学生&#xff0c; 这次签到的时间…

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令)&#xff0c;只读数据 (static int x)&#xff0c;读写堆栈 (int y)&#xff0c;读写运行时分配的内存 (???)&#xff0c;读写动态链接库 (???) 非法的地址 NULL&#xff0c;导致 se…

蓝桥杯第2357题——限高杆(多层图+dijkstra)

问题描述 某市有 &#x1d45b; 个路口, 有 &#x1d45a; 段道路连接这些路口, 组成了该市的公路系统。其 中一段道路两端一定连接两个不同的路口。道路中间不会穿过路口。 由于各种原因, 在一部分道路的中间设置了一些限高杆, 有限高杆的路段 货车无法通过。 在该市有两个…

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用&#xff0c;也经常忘记&#xff0c;特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

Git系列:git log 掌握版本控制的精髓

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【科普】ChatGPT-4o 是什么?和之前的ChatGPT4.0有什么区别,各有什么优劣势

文章目录 前言一、ChatGPT-4o 是什么&#xff1f;**主要特点和改进**&#xff1a; 二、ChatGPT-4o 和之前的ChatGPT4.0有什么区别&#xff0c;各有什么优劣势区别优势和劣势ChatGPT-4.0ChatGPT-4o 前言 5月13日&#xff0c;ChatGPT-4o发布&#xff0c;是人工智能的进一步发展&…

【leetcode面试经典150题】-27. 移除元素

88.合并两个有序数组 1 题目介绍1 个人解题思路1.1 解题代码1.2 思路解析 2、分析官方题解2.1 单侧双指针2.2 双侧双指针 1 题目介绍 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外…

Echarts结课之小杨总结版

Echarts结课之小杨总结版 前言基础回顾框架sale框架代码&#xff1a; user框架基础代码&#xff1a; inventory框架基础代码&#xff1a; total框架基础代码&#xff1a; 基础设置1.标题(Title)2.图例(Legend)实现 3.工具提示(Tooltip)实现 4.X轴(X Axis) 和 Y轴(Y Axis)5.数据…

「Qt Widget中文示例指南」如何实现一个快捷编辑器(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 快捷编辑器示例展示…

Leetcode 第 129 场双周赛题解

Leetcode 第 129 场双周赛题解 Leetcode 第 129 场双周赛题解题目1&#xff1a;3127. 构造相同颜色的正方形思路代码复杂度分析 题目2&#xff1a;3128. 直角三角形思路代码复杂度分析 题目3&#xff1a;3129. 找出所有稳定的二进制数组 I思路代码复杂度分析 题目4&#xff1a;…

电子邮箱是什么?怎么申请一个电子邮箱?

电子邮箱是我们沟通的工具&#xff0c;细分为免费版电子邮箱和付费版电子邮箱。怎么申请一个属于自己的电子邮箱&#xff1f;今天小编就分享一下电子邮箱注册教程&#xff0c;手把手教您注册一个电子邮箱。 一、电子邮箱的定义 电子邮箱&#xff0c;简称邮箱&#xff0c;是一…

BGP路由优选

1.BGP路由优选规则 上述规则依序排列&#xff0c;BGP进行路由优选时&#xff0c;从第一条规则开始执行&#xff0c;如果根据第一条规则无法作出判断&#xff0c;例如路由的Preferred-Value属性值相同&#xff0c;则继续执行下一条规则&#xff0c;如果根据当前的规则&#xff0…

如何快速打开多个网页?

在平常的工作当中&#xff0c; 如果每天都需固定打开几个网站&#xff0c;可以通过创建一个批处理&#xff0c;一键打开需要的所有网站。 使用方法&#xff1a; 在桌面新建一个txt文本&#xff0c;按照以下格式输入代码&#xff0c;并将需要打开网站的地址输入进去。 ​ ec…

JavaScript异步编程——11-异常处理方案【万字长文,感谢支持】

异常处理方案 在JS开发中&#xff0c;处理异常包括两步&#xff1a;先抛出异常&#xff0c;然后捕获异常。 为什么要做异常处理 异常处理非常重要&#xff0c;至少有以下几个原因&#xff1a; 防止程序报错甚至停止运行&#xff1a;当代码执行过程中发生错误或异常时&#x…

虚拟化技术 在vCenter Server创建数中心、添加主机

一、实验内容 1.安装Flash 2.在vCenter Server创建数中心、添加主机 二、实验主要仪器设备及器材 1.安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置 2.在Windows Server 2008 R2已安装vCenter Server 3.Adobe Flash Player 12.0.0.70.e…

算法-卡尔曼滤波之卡尔曼滤波的第一个方程:状态更新方程

通过一个例子来引出卡尔曼滤波的状态更新方程&#xff1b; 这里系统状态是金条的重量&#xff1b; 为了估计系统的状态&#xff0c;我们可以多次测量金条的重量&#xff0c;然后求平均值&#xff1b; 其中估计值是所有测量值的平均值&#xff1b; 由于我们使用的是静态模型&am…

第十六节:图 (20节)

一 图的概念 1&#xff09;由点的集合和边的集合构成 2&#xff09;虽然存在有向图和无向图的概念&#xff0c;但实际上都可以用有向图来表达 3&#xff09;边上可能带有权值 二 图结构的表达 1&#xff09;邻接表法 2&#xff09;邻接矩阵法 3&#xff09;除此之外还有其他众多…

Halcon与深度学习框架结合进行图像分析

Halcon 是一款强大的机器视觉软件&#xff0c;而深度学习框架如 TensorFlow 或 PyTorch 在图像识别和分类任务中表现出色。结合两者的优势&#xff0c;可以实现复杂的图像分析任务。Halcon 负责图像预处理和特征提取&#xff0c;而深度学习框架则利用这些特征进行高级分析和识别…

【完整过程】Windows下记录PadleOCR训练自己的ocr模型

一、前期准备 1、代码 参考的博主使用的是2.6版本的 博主的paddleocr代码 下面这个是官方的&#xff0c;可能已经更新了&#xff08;我用的是官网当前最新版&#xff09; paddleocr的源代码 注意&#xff1a;最好把上面两个代码都下载下来&#xff0c;后面都会用到 参考博…