当前位置: 首页 > news >正文

【面试】基本数据类型的包装类缓存

目录

          • 1. 说明
          • 2. Integer类分析
            • 2.1 代码块
            • 2.2 字节码
            • 2.3 分析
            • 2.4 valueOf方法

1. 说明
  • 1.在java中,基本数据类型的包装类(Integer、Byte、Character、Short、Long、Boolean)的某些值会被缓存。
  • 2.以提高性能并减少内存使用。
  • 3.这种缓存机制是自动的,并且对于开发者来说是透明的。
  • 4.对于Byte、Short、Integer、Long这些整数类型的包装类为-128到127之间的值提供了缓存。
  • 5.Character:字符类型的包装类Character为0到127之间的值提供了缓存
  • 6.对于Float和Double:这两个浮点类型的包装类并没有为任何值提供缓存。因为浮点数的精度问题使得缓存所有可能的值变得不实际。
  • 7.Boolean: Boolean类型的包装类为true和false两个值提供了缓存。因为Boolean只有两个可能的值,它的缓存机制非常直接和简单。使用Boolean.TRUE和Boolean.FALSE时,得到的是缓存中的对象实例。
  • 8.在进行对象比较时,通常推荐使用equals()方法而不是==操作符,因为equals方法提供了更健壮和一致的语义。当处理不同源(一个通过valueOf方法获得,一个通过new关键字创建)的对象,equals方法比==操作符更可靠。
2. Integer类分析
2.1 代码块
public void test(){Integer a = 10;Integer b = 10;
}
2.2 字节码
 0 bipush 102 invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>5 astore_16 bipush 108 invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
11 astore_2
12 return
2.3 分析
  • 1.bipush 10 bipush用于将一个字节(-128到127)的值推送到操作数栈上。即把10推送到操作数栈。
  • 2.invokestatic #5 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;> invokestatic 调用一个静态方法。#5 指向常量池中某个条目的索引,这里指向java/lang/Integer.valueOf方法的符号引用。(I)Ljava/lang/Integer 方法的描述符,该方法接受一个int类型的参数(由(I)表示)并返回一个java.lang.Integer类型的对象(由 (I)Ljava/lang/Integer;> 表示)。执行此指令时,JVM会从操作数栈顶部弹出一个int值(在这个例子中是10),将其作为参数调用java.lang.Integer.valueOf方法,并将返回的Integer对象推送到操作数栈的顶部。
  • 3.astore_1 将操作数栈顶部的值(在这个例子中是Integer对象)存储到局部变量数组的第二个位置(索引为1,因为局部变量数组的索引从0开始)。
2.4 valueOf方法
  • 1.代码块
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
  • 2.当i大于等于-128且小于等于127,则返回缓存中的对象,否则创建一个新对象。
http://www.lryc.cn/news/380614.html

相关文章:

  • 6月20日(周四)A股行情总结:A股险守3000点,恒生科技指数跌1.6%
  • Parallels Desktop 19 for mac破解版安装激活使用指南
  • JExcel API使用笔记
  • springCloudAlibaba之分布式网关组件---gateway
  • Springboot项目jar加密
  • 【React】高阶组件
  • 全面理解-Flutter(万字长文,深度解析)
  • RabbitMQ实战宝典:从新手到专家的全面探索
  • 6月21日(周五)AH股总结:沪指失守3000点,恒生科技指数跌近2%,多只沪深300ETF午后量能显著放大
  • 双非本,3年时间从外包到阿里P6(Android岗),看我是怎么逆袭成功的?
  • 前端面试题(基础篇七)
  • ARM架构简明教程
  • DWG转PDF字体研究记录
  • Java中如何处理日期和时间?
  • Kubernetes之Pod详解
  • 长亭谛听教程部署和详细教程
  • 修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)
  • Linux的基本指令第二篇
  • php百度云账户余额查询API示例
  • 自动化开发任务:在PHP框架中实现自定义命令
  • 如何在Java中实现数据加密与解密?
  • Nginx日志管理之日志分析
  • 利用 Microsoft ChatGPT 和 OPC UA 改变工业格局
  • 力扣-两数之和
  • 基于CDMA的多用户水下无线光通信(3)——解相关多用户检测
  • 哔哩哔哩视频URL解析原理
  • 个人成长的利器:复盘教你如何避免重蹈覆辙
  • 2025秋招NLP算法面试真题(一)-史上最全Transformer面试题
  • 基于STM32的智能家居安防系统
  • React+TS前台项目实战(十二)-- 全局常用组件Toast封装,以及rxjs和useReducer的使用