Integer 缓存

news/2025/1/15 22:00:01/

在 Java 中,如果你通过 new Integer(value) 显式创建一个 Integer 对象,以下几点需要注意:

内存中的 Integer 对象

  1. 缓存范围

    Java 自动缓存Integer 对象范围是从 -128127。这些对象在类加载时被创建并存储在内存中。

  2. 使用 new 创建对象

    当你使用 new Integer(value) 创建一个整数对象时,无论 value 的值是 -1270100 还是 128,都会创建一个新的 Integer 对象。即使这个值在缓存范围内,new 关键字也不会返回缓存中的对象。

`Integer a = new Integer(100);   // 创建新对象
Integer b = new Integer(100);   // 又创建一个新对象
System.out.println(a == b);      // 输出: false`
  1. 缓存对象的存在

    缓存的对象在内存中始终存在,直到 JVM 结束。你可以通过 Integer.valueOf(int value) 方法获取缓存对象。

   
Integer c = Integer.valueOf(100);   // 使用缓存
Integer d = Integer.valueOf(100);   // 同样使用缓存
System.out.println(c == d);          // 输出: trueimport java.util.HashMap;
import java.util.Map;public class IntegerCache {
private static final Map<Integer, Integer> cache = new HashMap<>();static {for (int i = -128; i <= 127; i++) {cache.put(i, i);}
}
public static Integer valueOf(int value) {return cache.getOrDefault(value, new Integer(value));
}public static void main(String[] args) {Integer a = IntegerCache.valueOf(100);Integer b = IntegerCache.valueOf(100);System.out.println(a == b);  // 输出: trueInteger x = IntegerCache.valueOf(200);Integer y = IntegerCache.valueOf(200);System.out.println(x == y);  // 输出: false
}}

总结

  • 使用 new Integer(value) 会创建新对象,而不会使用缓存的对象。
  • 缓存Integer 对象(-128 到 127)在内存中始终存在,但通过 new 创建的对象不会与这些缓存对象相同。
  • 若要利用缓存,使用 Integer.valueOf(int) 方法是最佳选择。
  • 返回缓存对象:当你调用 Integer.valueOf(int value) 时,该方法会检查传入的值是否在缓存范围内(-128 到 127)。如果是,它会返回缓存中的对象,而不是创建新的对象。
`public static Integer valueOf(int i) {if (i >= Integer.MIN_VALUE && i <= 127) {return IntegerCache.cache[i + 128]; // 返回缓存中的对象}return new Integer(i); // 超出范围时,创建新对象
}`

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

相关文章

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…

使用@test-library/react的screen中的方法和直接使用getByText,getByTestId等的区别?

在 React Testing Library 中&#xff0c;screen 对象和直接使用 getByText, getByTestId 等方法之间的主要区别在于它们的使用方式和上下文。然而&#xff0c;从功能的角度来看&#xff0c;它们实际上是相互关联的&#xff0c;因为 screen 对象提供了一组封装好的查询方法&…

2024非常全的接口测试面试题及参考答案

一、前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&…

11Python的Pandas:可视化

Pandas本身并没有直接的可视化功能&#xff0c;但它与其他Python库&#xff08;如Matplotlib和Seaborn&#xff09;无缝集成&#xff0c;允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法&#xff1a; 1. 使用Matplotlib Pandas中的plot()方法…

架构设计 - 常用日志收集方案选型对比与推荐

目录 1. 常用组合1.1 ELK Stack -> Elastic Stack1.2 EFK Stack1.3 Graylog1.4 PLG 日志系统1.5 Splunk1.6 Filebeat ELK1.7 AWS CloudWatch Logs1.8 阿里云日志服务1.9 腾讯云 CLS&#xff08;日志服务&#xff09; 2. 推荐 日志收集是系统监控和调试中的关键环节。常见的…

彩漩科技亮相企业出海峰会,展示智能办公新力量

近日&#xff0c;在北京市海淀区商务局的指导下&#xff0c;由中关村东升科技园联合创新企业科普联盟共同举办的企业出海峰会于北京成功举办。本次峰会以“出海新征程&#xff0c;企业新高度”为核心议题&#xff0c;深入探讨全球化背景下科技企业出海面临的机遇与挑战。通过汇…

Linux常用命令笔记

执行查看帮助命令 1.1 Linux命令的格式 命令名称 [命令参数] [命令对象] 命令名称、命令参数、命令对象之间请用空格键分隔命令对象一般是指要处理的文件、目录、用户等资源&#xff0c;而命令参数可以用长格式&#xff08;完整的选项名称&#xff09;&#xff0c;也可以用短…

95、k8s之rancher可视化

一、ranker 图形化界面 图形化界面进行k8s集群的管理 rancher自带监控----普罗米修斯 [rootmaster01 opt]# docker load -i rancher.tar ##所有节点 [rootmaster01 opt]# docker pull rancher/rancher:v2.5.7 ##主节点[rootmaster01 opt]# vim /etc/docker/daemon.jso…