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

Java数据结构之装箱拆箱

装箱和拆箱

也叫装包拆包,装包是把那八种基本数据类型转换为它的包装类,拆包则相反

上面这俩种方式都是装包,下面是它的字节码文件

用到了Integer的ValueOf方法:

就是返回了一个Integer类的对象,把它的value属性设置成了指定的值。

下面是拆包:

用到了intValue方法:

自动装箱拆箱,显式装箱拆箱

这是自动装箱拆箱

这是显式装箱和拆箱

看一下八种数据类型自动装箱的源码:

//boolean原生类型自动装箱成Booleanpublic static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);}//byte原生类型自动装箱成Bytepublic static Byte valueOf(byte b) {final int offset = 128;return ByteCache.cache[(int)b + offset];}//short原生类型自动装箱成Shortpublic static Short valueOf(short s) {final int offset = 128;int sAsInt = s;if (sAsInt >= -128 && sAsInt <= 127) { // must cachereturn ShortCache.cache[sAsInt + offset];}return new Short(s);}//char原生类型自动装箱成Characterpublic static Character valueOf(char c) {if (c <= 127) { // must cachereturn CharacterCache.cache[(int)c];}return new Character(c);}//int原生类型自动装箱成Integerpublic static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}//long原生类型自动装箱成Longpublic static Long valueOf(long l) {final int offset = 128;if (l >= -128 && l <= 127) { // will cachereturn LongCache.cache[(int)l + offset];}return new Long(l);}//double原生类型自动装箱成Doublepublic static Double valueOf(double d) {return new Double(d);}//float原生类型自动装箱成Floatpublic static Float valueOf(float f) {return new Float(f);}

可以发现除了Double和Float类型只是new一个新对象,其他类型都用到了cache方法,也就是用到了缓存策略

为什么使用缓存策略:缓存中的对象都是经常使用的,可以避免每次装箱都new一个新的对象,导致浪费内存

而double和float没有经常使用的,所以就没必要用到缓存策略

有趣的面试题

结果是:true false

这是因为缓存中的Integer数据的范围是从-128到127,100在此范围内,所以不用产生新对象,200不再此范围内,所以每次装箱都要new一个新对象

包装类的比较

这是因为:

当==左右两边是包装类的引用时,比较的是指向的对象

当==左右俩边有算数运算符时,比较的是对象的value属性,即数值

包装类的equals方法比较的也是数值,如下:

http://www.lryc.cn/news/276323.html

相关文章:

  • 各版本 操作系统 对 .NET Framework 与 .NET Core 支持
  • Golang 线程安全与 sync.Map
  • 1.2 Hadoop概述
  • Adams许可管理安全控制策略
  • 无人地磅系统|内蒙古中兴首创无人地磅和远程高效管理的突破
  • 【SpringCloud】7、Spring Cloud Gateway限流配置
  • 【gRPC学习】使用go学习gRPC
  • C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)
  • 域名解析服务器:连接你与互联网的桥梁
  • 理论物理在天线设计和射频电路设计中的应用
  • MySql01:初识
  • Python——运算符
  • 赋能软件开发:生成式AI在优化编程工作流中的应用与前景
  • 通过盲对抗性扰动实时击败基于DNN的流量分析系统
  • 【Project】TPC-Online Module (manuscript_2024-01-07)
  • 通过cpolar在公网访问本地网站
  • Prokka: ubuntu安装的时候出现错误
  • 安全防御之密码技术
  • 一文读懂「多模态大模型」
  • 深入PostgreSQL:高级函数用法探索
  • huggingface实战bert-base-chinese模型(训练+预测)
  • CCS安装和导入项目及编译教程
  • 在React里面使用mobx状态管理详细步骤
  • 1.6PTA集练7-5~7-24、7-1、7-2,堆的操作,部落冲突(二分查找)
  • uniapp向上拉加载,下拉刷新
  • 目标检测脚本之mmpose json转yolo txt格式
  • 大数据技术在民生资金专项审计中的应用
  • 视觉SLAM十四讲|【四】误差Jacobian推导
  • 「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(一)
  • 【习题】应用程序框架