Java自动拆装箱与缓存——Java中的128陷阱

news2025/1/21 7:22:44

在讲解128陷阱之前,需要了解一些概念。

包装器类型

Java是面向对象的语言,但基本类型并不是面向对象的,从而出现了包装器类型,并且包装器添加了更多的属性和方法。如我们在使用集合类型Collection的时候就一定要使用包装类型而非基本类型,它相当于将基本类型"包装起来",使它具有了对象的性质,丰富了基本类型的操作。

包装器类包括Integer、Long、Float、Double、Short、 Byte、Character和Boolean

前6 个类派生于公共的超类Number。

包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,包装器类还是final,因此不能派生它们的子类。

自动装箱器

自动将基本数据类型转换为包装器类型。

通过查看Integer.valueOf()方法源码,可以看到这个方法就是将int基本类型转换为Integer包装类型的方法,这个就是自动装箱的底层原理。

自动体现在,例如下图,创建了一个ArrayList对象, 因为在添加时会将int类型自动转换成Integer类型,arrayList.add(c)实际上是执行了 arrayList.add(Integer.valueOf(c))

自动拆箱器

自动将包装器类型转换为基本数据类型。

拆箱过程是通过调用包装器的 xxxValue方法实现的(xxx代表对应的基本数据类型)

当把一个Integet对象赋给一个int值时,并不会报错,原因就是在复制给int基本类型时,会自动执行拆箱操作,也就是 int d = arrayList.get(0).intValue();

输出结果为2. 

自动拆装箱与缓存

(这里以Integer为例)

看到上面这个代码时,可以先思考一下输出结果到底是什么。

我们可能会认为上面的两个判断的结果都是false。

虽然比较的值是相等的,但是由于比较的是对象,而对象的引用不一样,所以会认为两个是false的。

但其实并不是这样的,输出的结果第一个是true,这就和Integer中的缓存机制有关,也是传说中的128陷阱

在Integer的valueOf()方中,当数值在-128-127之间时,数值都存储在一个cache数组中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的,因为判断的都是同一个对象的地址。而但如果不在这个区间的数,则需要新开辟一个内存空间,比较的就不是同一个对象,所以不相等。

 如果是new一个对象时,则不会出现这种情况。

在别的包装类中,也有缓存技术。

包装类型基本数据类型缓存对象(基本数据类型值)
Booleanbooleantrue,false(全部值)
Bytebyte-128~127(全部值)
Shortshort-128~127
Characterchar0~127
Integerint-128~127(默认为127)
Longlong-128~127
Floatfloat无缓存值
Doubledouble无缓存值

 

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

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

相关文章

高等学校学生公寓消防安全设计及管理设计要点

摘要:高等学校学生公寓是学生生活起居和日常活动的重要场所,具有人员同时聚集的特征,属于人员密集场所。特别是晚间休息时,此时宿舍内人员达到满员状态。学生的生活及学习物品,如被褥、衣服、书籍等,都属于…

Prometheus标签的使用说明

prometheus在处理数据指标的过程中,包括【抓取的生命周期】和【标签的生命周期】 默认情况下,当prometheus加载target实例完成后,这些target时候会包含一些默认的标签,这些标签将会告诉prometheus如何从target实例中获取监控数据…

【3】Linux多节点部署KubeSphere|最简单的安装方法

目录 步骤1:准备三台服务器 步骤2:下载KubeKey 步骤3:创建集群 1. 创建示例配置文件 2. 编辑配置文件 3. 使用配置文件创建集群 4. 验证安装 步骤1:准备三台服务器 4c8g (master)8c16g * 2 (worker)centos7.9内网互通每个机…

Tiktok的发展趋势以及政策支持,你了解多少?

武汉瑞卡迪电子商务有限公司:为了方便大家的阅读,这篇文章将分为以下几个板块: 1、Tiktok的基本介绍 2、Tiktok的发展趋势以及政策支持 3、新手运营Tiktok的方法 4、Tiktok引流的方法 一、Tiktok的基本介绍 TikTok TikTok国际版&#xf…

express 1.1安装express And 1.2创建项目

目录 1.1安装express 1.2.1 创建项目 (1)使用vscode,可以快速创建项目,vscode把终端聚合在了一起,打开vscode终端 (2)进入工作目录 (3)执行创建命令 (4&…

MySQL必知必会_SELECT部分

最近在读MySQL必知必会,关于这本书打算写点读后感,大概是两篇博客的体量。 其实对于测试岗来说,不管是面试还是实际工作中,最重要的自然当属SELECT。 下面我把书里关于SELECT的知识点简单记一下吧。 首先在MySQL中其实是不区分…

【MySQL】第二部分 MySQL的启动和登录

【MySQL】第二部分 MySQL的启动和登录 文章目录【MySQL】第二部分 MySQL的启动和登录2. MySQL的启动和登录2.1 服务的启动与停止2.2 客户端登录查看版本信息退出登录2.3 演示命令行的使用总结2. MySQL的启动和登录 2.1 服务的启动与停止 MySQL的安装就不过多介绍了,大家可以去…

OpenSceneGraph纹理API开发指南【OSG】

前面的教程中,我们用彩虹的所有颜色画了一个正方形。然而,还有另一种成为纹理映射的技术,将光栅二维图像应用于三维几何。在这种情况下,效果不是针对几何体的顶点,而是通过栅格化场景更改获得的所有像素的数据。这种技…

好雨科技加入龙蜥 完成与 Anolis OS 兼容适配

近日,北京好雨科技有限公司(以下简称“好雨科技”)签署了 CLA(Contributor License Agreement,贡献者许可协议) ,正式加入龙蜥社区(OpenAnolis)。好雨科技成立于 2015 年…

bug总是多不如看一看,前端写完代码进行的自测流程减少bug重复反工,提高开发效率。

提测标准:修改bug前要熟知之前的操作逻辑以及涉及其代码的周边逻辑,修改bug后的操作逻辑和测试确认,检测其它周边逻辑。至少需要另外1个开发进行交叉测试必要时进行代码Code Review(代码规范,主要逻辑,复杂…

服务器SMTP邮件设置

服务器SMTP邮件设置 在服务器设置登录验证时需要绑定一个自动收发邮件的服务器进行验证 这时候就要对STMP进行配置,如下 填写的主机为邮件对应的主机 腾讯QQ邮箱 POP3:pop.qq.com SMTP:smtp.qq.com IMAP:imap.qq.com 端口&…

1.13

周报 完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleed…

算法第十期——DFS(深度优先搜索)的剪枝优化

目录 DFS:剪枝 DFS:有哪些剪枝方法 DFS例题一:剪格子 【思路】 DFS例题二:路径之谜 【样例分析】 DFS例题三:四阶幻方 【思路】 【做法一】 【做法二】 DFS例题三:分考场 【样例分析】 【思路】 DFS习题 DFS:剪…

TPM零知识学习十一 —— tpm全安装流程复盘(下)

接前一篇文章《TPM零知识学习十 —— tpm全安装流程复盘(中)》,链接为: TPM零知识学习十 —— tpm全安装流程复盘(中)_蓝天居士的博客-CSDN博客 五、TPM模拟器做成服务 本步骤前导步骤参见 《TPM零知识学…

Docker——网络配置

目录 本次目标: 一、Docker网络配置 1.bridge模式(默认模式) 2.host模式 二、bridge模式 三、host模式 网络模式与数据卷容器挂载的操作 四、如何创建自定义网络 本次目标: Docker网络配置Docker部署SpringCloud项目 一、Docker网络配置 Dock…

蓝牙耳机啥牌子音质好?听音乐最好的蓝牙耳机分享

现如今,蓝牙耳机越来越成为外出携带设备使用频率最高的数码产品之一。随着技术的进步,蓝牙耳机在音质上的表现也受到了很多人的关注。在这,我来给大家介绍四款音质很不错的蓝牙耳机,一起来看看吧。 一、南卡小音舱蓝牙耳机 售价…

SpringBoot+Vue项目医护人员排班系统

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…

Unity3d VFX 采用skinned mesh sampling(蒙皮采样)发射粒子效果时fbx模型是否优化(Optimized)带来的问题记录

前言&问题 如题的问题困扰了很久,最近终于在机缘巧合下解决了,这里特此记录分享一下,可能会对此有问题的朋友有点引导。 之前在弄一个通过摄像头/或视频识别人物的肢体动作并同步的功能: 详细功能可以去B站查看一下。https…

python学习 --- 列表基础

目录 一、列表的创建 1、使用中括号 2、使用中括号和内置函数list() 二、列表的特点 三、获取列表中元素 1、获取列表中指定元素的索引-index() 2、获取列表中单个元素 3、获取列表中多个元素-切片 四、列表元素的查询和遍历 1、判断指定元素在列表中是否存在 2、遍历…

为什么使用 golang http包 会把 linux 句柄打满?

最近工作的时候一个接入服务需要测性能测试,万万没想到测出了一个把 linux 句柄打满的问题 具体是什么问题呢,我们一起来看看 正常操作 项目中,有一些 http 请求是这样写的: 请求 https 的地址,为了绕过 tls &…