Java基础---有了基本类型为什么还需要包装类

news2024/9/21 3:26:42

目录

缘由

基本类型和包装类型的区别

如何理解自动拆装箱

哪些地方会自动拆装箱

自动拆装箱与缓存


  • 缘由

  • Java中有8种基本数据类型,这些基本类型又都有对应的包装类

  • 因为Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型
  • 比如,在集合类中,是无法将int、double等类型放进去的
  • 因为集合的容器要求元素是Object类型
  • 为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作
  • 基本类型和包装类型的区别

  • 1-默认值不同,基本类型的默认值为0,false或\u0000等,包装类默认为null
  • 2-初始化方式不同,一个需要new,一个不需要
  • 3-存储方式不同,基本类型保存在栈上,包装类对象保存在堆上(通常情况下,在没有JIT优化栈上分配时)
  • 如何理解自动拆装箱

  • 拆箱与装箱
  • 包装类是对基本类型的包装,所以,把基本数据类型转换成包装类的过程就是装箱
  • 反之,把包装类转换成基本数据类型的过程就是拆箱
  • 自动拆装箱
  • 在Java SE5中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能
  • 自动装箱:就是将基本数据类型自动转换成对应的包装类
  • 自动拆箱:就是将包装类自动转换成对应的基本数据类型

  • 自动拆装箱原理

  • 自动装箱都是通过包装类的valueOf()方法来实现的
  • 自动拆箱都是通过包装类对象的xxxValue()来实现的
  • 如:
  • int的自动装箱都是通过 Integer.valueOf() 方法来实现的
  • Integer的自动拆箱都是通过 integer.intValue() 来实现的
  • 哪些地方会自动拆装箱

  • 了解过原理之后,在来看一下,什么情况下,Java会帮我们进行自动拆装箱
  • 前面提到的变量的初始化和赋值的场景就不介绍了,那是最简单的也最容易理解的
  • 这里主要来看一下,那些可能被忽略的场景
  • 场景一、将基本数据类型放入集合类
  • Java中的集合类只能接收对象类型,那么以下代码为什么会不报错呢?

  • 将上面代码进行反编译,可以得到以下代码:

  • 通过以上可以得出结论,当把基本数据类型放入集合类中的时候,会进行自动装箱
  • 场景二、包装类型和基本类型的大小比较
  • 当对Integer对象与基本类型进行大小比较的时候,实际上比较的是什么内容呢?看以下代码:

  • 对以上代码进行反编译,得到以下代码:

  • 可以看到,包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的
  • 场景三、包装类型的运算
  • 当对Integer对象进行四则运算的时候,是如何进行的呢?看以下代码:

  • 反编译后代码如下:

  • 可以发现,两个包装类型之间的运算,会被自动拆箱成基本类型进行
  • 场景四、三目运算符的使用
  • 看一个简单的三目运算符的代码:

  • 很多人不知道,其实在 int k = flag ? i : j;
  • 这一行,会发生自动拆箱
  • 反编译后代码如下:

  • 这其实是三目运算符的语法规范
  • 当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作
  • 因为例子中,flag ? i : j;
  • 片段中,第二段的i是一个包装类型的对象,而第三段的j是一个基本类型,所以会对包装类进行自动拆箱
  • 如果这个时候i的值为 null ,那么就会发生NPE([自动拆箱导致空指针异常])
  • 场景五、函数参数与返回值
  • 这个比较容易理解,直接上代码了:

  • 自动拆装箱与缓存

  • Java SE的自动拆装箱还提供了一个和缓存有关的功能,先来看一下代码,猜测一下输出结果:

  • 普遍认为上面的两个判断的结果都是false
  • 虽然比较的值是相等的,但是由于比较的是对象,而对象的引用不一样,所以会认为两个if判断都是false的
  • 在Java中,==比较的是对象引用,而equals比较的是值
  • 所以,在这个例子中,不同的对象有不同的引用,所以在进行比较的时候都将返回false
  • 奇怪的是,这里两个类似的if条件判断返回不同的布尔值
  • 上面这段代码真正的输出结果:

  • 原因就和Integer中的缓存机制有关
  • 在Java 5中,在Integer的操作上引入了一个新功能来节省内存和提高性能
  • 整型对象通过使用相同的对象引用实现了缓存和重用

  • 我们只需要知道,当需要进行自动装箱时,如果数字在-128至127之间时,会直接使用缓存中的对象,而不是重新创建一个对象
  • 其中的javadoc详细的说明了缓存支持-128到127之间的自动装箱过程
  • 最大值127可以通过 -XX:AutoBoxCacheMax=size 修改
  • 实际上这个功能在Java 5中引入的时候,范围是固定的-128 至 +127
  • 后来在Java 6中,可以通过 java.lang.Integer.IntegerCache.high 设置最大值
  • 这使我们可以根据应用程序的实际情况灵活地调整来提高性能
  • 到底是什么原因选择这个-128到127范围呢?
  • 因为这个范围的数字是最被广泛使用的
  • 在程序中,第一次使用Integer的时候也需要一定的额外时间来初始化这个缓存
  • 在Boxing Conversion部分的Java语言规范(JLS)规定如下:
  • 如果一个变量p的值是:

  • 范围内时,将p包装成a和b两个对象时,可以直接使用a==b判断a和b的值是否相等

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

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

相关文章

Domino Admin管理客户机中为每个管理域设置不同的图标

大家好,才是真的好。 一直在讲Domino管理中的单个网络 域,很少讲到多个Domino网络域的管理。其实,很多企业会有多个Domino网络域。因为以前多个部门或组织、企业等合并,或者隔离国内和国外的目录隔开等等,都会产生多个…

从0-1手写一个RPC框架

前言 什么是RPC RPC(Remote Procedure Call)远程过程调用,简言之就是像调用本地方法一样调用远程服务。目前外界使用较多的有gRPC、Dubbo、Spring Cloud等。相信大家对RPC的概念都已经很熟悉了,这里不做过多介绍。 为啥要自己写…

nvm 和 nrm安装使用

前端工具推荐:nvm(Node 版本管理工具) 和 nrm(管理npm源): 一、nvm 1.1 nvm 是什么 1.2 安装 nvm 1.3 使用 nvm 二、nrm 2.1 nrm 是什么 2.2 安装 nrm 2.3 使用 nrm 一、nvm 如果直接将 node 安装到…

20230701:成电的“七年之痒”,毕业啦

毕业那些事儿 毕业随笔写在最后 毕业随笔 伴随着走完最后一道流程,成电7年,总算是毕业了。经济下行,行业寒冬,全被90后赶上了,庆幸学校的金字招牌让自己斩获了不少OFFER。荒废了半年的跑步和博客计划,接下…

【测试开发】概念基础

目录 一. 需求 1. 用户需求 2. 软件需求 3. 从测试人员的角度看需求 二. 测试用例 三. BUG 四. 开发模型 1. 软件的生命周期 2. 开发模型 2.1 瀑布模型 2.2 螺旋模型 2.3 增量,迭代模型 2.4 敏捷模型 SCRUM 五. 测试模型 1. V模型 2. W模型 (双V模…

开源免费的多数据库工具Chat2DB

Chat2DB使用 当前使用的版本为1.0.11。 一.Chat2DB介绍 Chat2DB 是一款开源免费的多数据库客户端工具。 能够将自然语言转换为SQL,也可以将SQL转换为自然语言。 支持windows、mac本地安装,也支持服务器端部署,web网页访问。 支持多种数据库…

Hexo基本建站

目录 一、前言 二、Hexo安装、新建、启动 三、架构说明 四、写博客 五、打包 六、发布到GitHub 1.新建仓库 2.安装插件 3.修改配置文件:_config.yml 4.部署github 5.查看仓库 6.访问网站 一、前言 安装 Git安装 Node.js 二、Hexo安装、新建、启动 # 安装 h…

智慧园区平台建设解决方案

智慧园区是指利用现代互联网物联网技术,对园区内的设施、设备和人员进行高效管理和智能化运营的一种模式。越来越多的城市开始致力于发展智慧园区,实现园区内的资源共享和高效利用。为了让智慧园区达到最佳的效果,我们需要从平台建设方面入手…

Prettier - Code formatter配置(vscode)

1.安装Prettier 2.设置-->搜索format on save 并打勾 3.搜索default format 并选择Prettier - Code formatter 4.点击右上角打开setting.json 5.看最后一行是否存在如下配置,有就说明配置成功,没有重新前面步骤重新设置一下 6.根目录是否存在.prettierrc.json,没有创建一下 …

vue3原理和源码分析 - watch 源代码

https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts 目录 Watch /packages/runtime-core/src/apiWatch.ts watch.dot https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts Watch /packages/runtime…

6.3 B树,B+树

多路平衡查找树 1.定义 B树的阶:B树中所有结点的孩子个数的最大值,表示成m m阶B树:空树或者满足如下特性的m叉树 特性: 1.树中每个结点最多子树 m 关键字m-1 2.根节点不是终端结点,至少有两棵子树 3.根结点除外&…

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 Elas…

2023年最受欢迎和最佳WordPress主题(专家精选)

您在找2023年最佳WordPress主题吗? 免费和高级WordPress主题有数以千计,初学者很难为他们的网站选择合适的WordPress主题。 在本文中,我们将分享我们专家精选的2023年所有最受欢迎和最佳的WordPress主题。 本文网址: 2023年最受欢迎和最佳…

Nautilus Chain 推出全新 Layer3 DID 公民身份,限量 10 万枚免费发放

Nautilus Chain 是目前行业内首个模块化的 Layer3 机构链,该链此前基本完成了测试网的早期测试,并有望在近期上线主网。Nautilus Chain 近阶段市场活动频频,除了此前举办全球行活动推广 Layer3 概念外,其也在同期联合 Stanford Bl…

wps文档忘记保存关闭了怎么恢复

1、点击WPS左上角小箭头,点击下拉菜单中的工具选项,然后点击里面的备份中心。 2、在WPS的右侧会看到备份中心的小窗口,里面有自动备份的文件,还可以点击一键恢复即可复原之前的文件内容。 可以对之前时间段的文件打开。

什么是内存溢出,什么是内存泄漏?

文章目录 一、什么是内存溢出?二、什么是内存泄漏?三、如何避免? 提示:以下是本篇文章正文内容,下面案例可供参考 一、什么是内存溢出? 假设我们 JVM 中可用的内存空间只剩下 3M,但是我们要创…

Maven manual

Download maven Download 设置 system env… E:\apache-maven-3.9.3\bin查看版本信息 mvn -v Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f) Maven home: E:\apache-maven-3.9.3与Eclipse integrate Referrence,通常Eclipse原本就已经集成&am…

[STC32F12K54入门第三步]USART1+Modbus RTU从机

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Modbus RTU是什么?二、Modbus RTU程序展示1.串口配置2.Timer定时器配置3.配置CRC16校验位和Modbus RTU发送函数4.主函数5.效果展示总结提示:以下是本篇文章正文内容,下面案例可供参考 一、…

WebMvcConfigurationSupport 和 WebMvcConfigurer 区别和同时使用产生的问题-解决

在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为Deprecated(弃用)。 在Spring Boot 2.0后用自己的的配置类继承WebMvcConfigurerAdapter时&…

python多维数据可视化

文章目录 数据数据可视化平行坐标RadViz雷达图Andrews曲线矩阵图相关系数热力图参考文献多维度(3维以上)数据的可视化,用常规的方法不太好实现。本文介绍几种用Python实现的将多维数据展示在二维平面中的方法。 数据 以经典的鸢尾花数据集为例。 以下是5条经过格式处理的数…