Java基本数据类型、包装类及拆装箱详解
Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据,而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述,并对自动拆箱和装箱的源码实现进行分析。

基本数据类型与包装类的详解及应用场景
详细对应关系如下:
| 基本类型 | 包装类型 | 占用空间 | 范围 | 基本类型默认值 | 分类 |
|---|---|---|---|---|---|
| byte | Byte | 1个字节 | − 2 7 -2^7 −27~ 2 7 − 1 2^7-1 27−1 | 0 | 整型 |
| short | Short | 2个字节 | − 2 15 -2^{15} −215~ 2 15 − 1 2^{15} -1 215−1 | 0 | 整型 |
| int | Integer | 4个字节 | − 2 31 -2^{31} −231~ 2 31 − 1 2^{31} -1 231−1 | 0 | 整型 |
| long | Long | 8个字节 | − 2 63 -2^{63} −263~ 2 63 − 1 2^{63} -1 263−1 | 0 | 整型 |
| float | Float | 4个字节 | 1.4E-45~3.4028235E38 | 0.0 | 浮点型 |
| double | Double | 8个字节 | 4.9E-324~1.7976931348623157E308 | 0.0 | 浮点型 |
| char | Character | 2个字节 | ‘\u0000’~‘\uffff’ | ‘\u0000’ 0 | 字符型 |
| boolean | Boolean | 1个字节 | true/false | false | 布尔型 |
基本数据类型
Java的基本数据类型包括byte、short、int、long、float、double、char和boolean。它们是存储简单数据的理想选择,具有较低的内存占用和更高的性能。基本数据类型通常在以下场景中被广泛应用:
- 数值计算:基本数据类型在数值计算场景中表现出色,例如在科学计算、图形处理等领域。
- 数组操作:基本数据类型在数组和集合的存储中更为高效,适用于需要大量数据存储的场景。
- 原始数据表示:基本数据类型是存储原始数据的首选方式,对于一些简单的数据结构,如位运算、枚举等,基本数据类型更为直观和高效。
包装类
Java的包装类,即Byte、Short、Integer、Long、Float、Double、Character和Boolean,为基本数据类型提供了对象封装。包装类的应用场景主要包括:
- 集合类使用:集合类(如List、Map等)只能存储对象,而基本数据类型需要通过包装类来转换为对象才能存储在集合中。
- 泛型使用:泛型不能直接使用基本数据类型,而包装类可以作为泛型的类型参数,使得泛型在处理数据时更为灵活。
- 数据结构:在一些数据结构的实现中,需要使用包装类来处理一些特殊的数据情况。
基本数据类型与包装类的区别
基本数据类型和包装类在Java中有一些重要的区别,涵盖了创建方式、存储方式、默认值等多个方面。以下是它们的主要区别:
- 创建方式
基本数据类型: 可以通过直接声明变量并赋值来创建基本数据类型的变量;
包装类:包装类是引用类型,因此可以使用关键字 new 实例化对象,也可以使用自动装箱(Autoboxing)进行自动转换。例如:
Integer integerObj = new Integer(42); // 使用 new 实例化
Integer intObj = new 42; // 自动装箱
Double doubleObj = 3.14; // 自动装箱
- 存储方式
基本数据类型: 直接存储数值,占用较小的内存空间,存储在栈上。
包装类: 存储在堆上,由于是对象,占用的内存空间相对较大,同时需要考虑垃圾回收等额外的开销。
- 默认值
基本数据类型: 如果在声明时未赋值,基本数据类型会有默认值,默认值查看详细关系表格。
包装类: 如果在声明时未赋值,包装类会默认为 null。因为包装类是引用类型,而引用类型的默认值是 null。
自动装箱和拆箱
自动装箱(Autoboxing)
自动装箱是指将基本数据类型自动转换为对应的包装类。以Integer为例,当执行Integer i = 42;时,实际上会调用Integer.valueOf(42)。下面是Integer.valueOf方法的源码:
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
在这里,IntegerCache是一个内部静态类,用于缓存范围内的Integer对象,以提高性能。如果值在缓存范围内,直接返回缓存中的对象,否则创建一个新的Integer对象。
自动拆箱(Unboxing)
自动拆箱是指将包装类自动转换为对应的基本数据类型。以Integer为例,当执行int i = integerObject;时,实际上会调用integerObject.intValue()。下面是intValue方法的源码:
public int intValue() {return value;
}
在这里,value是Integer对象中存储的基本类型值。
自动拆装箱反编译代码
例如如下java代码:
public class Test {public static void main(String[] args) {//自动装箱int intVal = 2;Integer integerObj = intVal;//自动拆箱Integer integerObj1 = Integer.valueOf(4);int intVal1 = integerObj1;System.out.println("integerObj:"+integerObj+";intVal1:"+intVal1);}
}
我们可以看到反编译后的代码如下:
public class Test
{public static void main(String[] args){int intVal = 2;Integer integerObj = Integer.valueOf(intVal);Integer integerObj1 = Integer.valueOf(4);int intVal1 = integerObj1.intValue();System.out.println("integerObj:" + integerObj + ";intVal1:" + intVal1);}
}
通过反编译后的代码我们可以看到它拆装箱其实是调用了valueOf()和intValue()的实现自动拆装箱的
自动拆装箱使用场景
以下是一些使用自动拆装箱的常见场景
- 集合框架
在集合类中,通常要求存储对象而不是基本数据类型。使用自动装箱,可以将基本数据类型直接放入集合中,而在获取元素时会自动进行拆箱。
List<Integer> integerList = new ArrayList<>();
integerList.add(2); // 自动装箱
int value = integerList.get(0); // 自动拆箱
- 泛型
泛型在定义时需要指定引用类型,而不能使用基本数据类型。通过自动装箱和拆箱,可以在泛型中直接使用基本数据类型。
List<Integer> integerList = new ArrayList<>();
integerList.add(2); // 自动装箱
int value = integerList.get(0); // 自动拆箱
- 方法参数传递
在方法的参数列表和返回值中,可以直接使用基本数据类型,而方法的实现中会自动进行拆箱和装箱。
public void processInteger(Integer value) {// 自动拆箱int result = value + 10;System.out.println(result);
}public Integer getInteger() {// 自动装箱return 42;
}
- 比较操作
在比较操作中,可以直接比较基本数据类型的值,而不必显式地进行拆箱
Integer a = 42;
int b = 42;
if (a == b) {// 自动拆箱System.out.println("Equal");
}
- 数组列表的排序
使用 Collections.sort 对包含基本数据类型的包装类对象的列表进行排序。
List<Integer> integerList = new ArrayList<>();
integerList.add(3);
integerList.add(1);
integerList.add(2);Collections.sort(integerList); // 自动拆箱和装箱
这些场景中,自动拆装箱的机制简化了代码,提高了代码的可读性和编写效率。但需要注意,频繁的自动拆装箱操作可能会带来一些性能开销,特别是在性能敏感的代码中,需要谨慎使用。
总结
通过本文的详细解析,我们深入了解了Java基本数据类型和包装类的应用场景、特性,并通过源码分析了自动拆箱和装箱的实现原理。在实际开发中,理解这些概念和机制将帮助我们更好地选择合适的数据类型,并优雅地处理基本数据类型与包装类之间的转换。这对于构建性能高效、可维护的Java应用程序至关重要。但需要注意,频繁的自动拆装箱操作可能会带来一些性能开销,特别是在性能敏感的代码中,需要谨慎使用。
相关文章:
Java基本数据类型、包装类及拆装箱详解
Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据,而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述,并对自动拆箱和装箱的源码实…...
SIT2596,可替代LM2596,40V 输入 150KHz 3A 降压型电源转换器
SIT2596 是一款降压型开关电压调节芯片,可固定输出 3.3V、5V、12V,也可根据需要调节 输出电压,电压输出范围在 1.2V-37V,输入电压最高可达 40V,输出电流可达 3A;同时具有优异 的线性调整率和负载调整率。 SIT2596 内部集成频率…...
python + mongodb使用入门
最近用了下mongodb ,简单做个记录: 1.启动系统mongo服务 mongod -f mongod.conf其中 mongod.conf 是配置文件,示例如下: dbpath/youpath/data/db #数据库保存位置 logpath/youpath/data/mongod.log #日志 logappendtrue fo…...
焊接专业个人简历(通用25篇)
如果大家想在焊接行业的求职中脱颖而出,轻松斩获心仪职位,参考这25篇通用的焊接专业个人简历案例,无论您是初学者还是资深焊工,都能从中找到适合自己的简历内容。参考这些简历,让您的求职之路更加顺畅。 焊接专业个人…...
c++学习第四讲---函数提高
1.函数默认参数: 在( )中将参数赋值,如果传值了,则用传入值,否则才用函数中默认参数。 例: int func(int a, int b 3, int c 3) {return a b c; } int main() {cout << func(1, 2)…...
如何使用cpolar+Plex在Windows系统上搭建私人媒体影音站点公网可访问
文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…...
FreeRTOS-软件定时器
软件定时器 在FreeRTOS中可以设置无数个软件定时器,都是基于系统滴答中断。 使用软件定时器需要指定时间:启动定时器和运行回调函数。启动定时器和运行回调函数的间隔为定时器的周期。 使用软件定时器需要指定类型:一次性(回调函数…...
Lab 3: Recursion, Tree Recursion(CS61A 2020)
在网上没有lab3相应的答案,作者也卡蛮久 (就此补充一下答案) Q2: WWPD: Journey to the Center of the Earth Use Ok to test your knowledge with the following "What Would Python Display?" questions: python3 ok -q sr-ww…...
GVIM 配置 for begin/end class/endclass 等配对
有时候我们的代码很长,或者结构比较复杂,多个if/else 或者begin/end 快嵌套,为了阅读方便,利用gvim插件实现块跳转还是很有实用性的,下面的.vimrc的配置,简单方便。 使用方式: 将光标定位到块头…...
2024不收费的数据恢复软件EasyRecovery16
EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…...
【每日一题】找出叠涂元素
文章目录 Tag题目来源题目解读解题思路方法一:哈希表 写在最后 Tag 【哈希表】【数组】【2023-12-01】 题目来源 2661. 找出叠涂元素 题目解读 从左往右遍历 arr 给矩阵 mat 上色,在上色的过程中矩阵的某一行或者某一列的全部被上色了,返回…...
Qt面试题
1.QT信号槽机制的优缺点 优点: 1.类型安全:需要关联的信号槽的签名必须是等同的,即信号的参数类型和参数个数和接受该信号的槽的参数类型和参数个数相同。(PS:信号函数的参数个数必须大于等于槽函数的参数个数) 2.松…...
LeetCode:1038. 从二叉搜索树到更大和树(反向中序遍历 C++、Java)
目录 1038. 从二叉搜索树到更大和树 题目描述: 实现代码与解析: dfs 原理思路: 1038. 从二叉搜索树到更大和树 题目描述: 给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所…...
【文末送书】Python OpenCV从入门到精通
文章目录 🍔简介opencv🌹内容简介🛸编辑推荐🎄导读🌺彩蛋 🍔简介opencv OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和…...
RabbitMQ 的七种消息传递形式
文章目录 一、RabbitMQ 架构简介二、准备工作 三、消息收发1. Hello World2. Work queues3. Publish/Subscrite3.1. Direct3.2. Fanout3.3. Topic3.4. Header 4. Routing5. Topics 大部分情况下,我们可能都是在 Spring Boot 或者 Spring Cloud 环境下使用 RabbitMQ&…...
开源免费跨平台数据同步工具-Syncthing
Syncthing是一款开源免费跨平台的文件同步工具,是基于P2P技术实现设备间的文件同步,所以它的同步是去中心化的,即你并不需要一个服务器,故不需要担心这个中心的服务器给你带来的种种限制,而且类似于torrent协议&#x…...
java语言中受检异常和非受检异常的区别是什么?
在Java语言中,异常可以分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。 受检异常(Checked Exception):这是编译器要求必须进行处理的异常…...
vue3 element-plus el-table表头冻结,表头吸顶
一.使用方式 在main.ts页面创建 vue指令 import { createSticky } from /utils/stickyconst app createApp(App)createSticky(app)...app.mount(#app);在el-table标签上使用 v-sticky <div class"table-box"><!--此处的 .table-box 是会出现滚动条的DOM元…...
mysql中删除数据后,新增数据时id会跳跃,主键自增id不连续
引言: 在使用MySQL数据库时,有时候我们需要删除某些记录,但是删除记录后可能会导致表中的id不再连续排序。 如何实现删除记录后让id重新排序的功能。 如图: 删除数据后,中间的id不会自动连续。 下面有两种方法进行重…...
todesk连接ubuntu显示当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装X11桌面环境,或者使用终端文件功能
ToDesk远程遇到的问题如上图,换向日葵直接黑屏; 问题原因 截止发文时间,Todesk只支持X11协议,没有适配最新的Wayland协议,所以我们需要把窗口系统调整为X11才可以。 解决方法 修改配置文件,关闭wayland su…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
