Java基本数据类型、包装类及拆装箱详解

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

Java.jpg

基本数据类型与包装类的详解及应用场景

详细对应关系如下:

基本类型包装类型占用空间范围基本类型默认值分类
byteByte1个字节 − 2 7 -2^7 27~ 2 7 − 1 2^7-1 2710整型
shortShort2个字节 − 2 15 -2^{15} 215~ 2 15 − 1 2^{15} -1 21510整型
intInteger4个字节 − 2 31 -2^{31} 231~ 2 31 − 1 2^{31} -1 23110整型
longLong8个字节 − 2 63 -2^{63} 263~ 2 63 − 1 2^{63} -1 26310整型
floatFloat4个字节1.4E-45~3.4028235E380.0浮点型
doubleDouble8个字节4.9E-324~1.7976931348623157E3080.0浮点型
charCharacter2个字节‘\u0000’~‘\uffff’‘\u0000’ 0字符型
booleanBoolean1个字节true/falsefalse布尔型

基本数据类型

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应用程序至关重要。但需要注意,频繁的自动拆装箱操作可能会带来一些性能开销,特别是在性能敏感的代码中,需要谨慎使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot:SpringMVC(上)

文章目录 前言一、SpringMVC是什么&#xff1f;1.1 MVC的定义&#xff1a;1.2 MVC 和 Spring MVC 的关系 二、Spring MVC 创建和连接2.1创建springmvc2.2接下来&#xff0c;创建⼀个 UserController 类&#xff0c;实现⽤户到 Spring 程序的互联互通&#xff0c;具体实现代码如…

Python 自动化办公:文件快速整理分类

平时桌面或文件夹内鱼龙混杂&#xff0c;各种类型的文件都有怎么办&#xff1f; 本篇文章中&#xff0c;我们将学习如何使用 Python 编写一个文件整理分类的脚本。 该脚本能够自动获取文件类型&#xff0c;并将文件按照类型整理到不同的子文件夹中。 先看下效果&#xff0c;…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念&#xff0c;最早提出的时间是在2014年左右&#xff0c;随后一直处于上升期&#xff0c;随着前两年阿里、腾讯的相继入场&#xff0c;竞争逐步加大。低代…

【Virtual Box】显示界面后无反应

本文记录本人在使用Virtual Box中遇到的问题 1.Virtual Box启动后无反应点击菜单栏是可用的&#xff0c;但界面里的无法操作 【解决方法】&#xff1a;以管理员身份启动virtual Box

零基础学编程,中文编程工具构件之弹出菜单构件教程,中文编程工具下载

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础…

如何保持操纵机构丝杆的精度?

滚珠丝杆是操纵机构中的重要组成部分&#xff0c;可以传递较高的扭矩&#xff0c;并且具有低摩擦、高效率和快速响应的特性&#xff0c;这使得操纵机构能够实现高速、高精度的运动控制&#xff0c;这对于整个系统的性能和精度具有决定性的影响&#xff0c;保持操纵机构丝杆的精…

100G数据中心升级改造策略

视频流媒体的兴起和物联网设备的大幅增长带来数据量爆炸性增长&#xff0c;人们对算力的需求越来越大&#xff0c;网络的升级改造也成为每个数据中心关注的重点。为了应对网络压力&#xff0c;数据中心需要升级到100G及以上速率&#xff0c;为企业和用户提供高性能计算、存储和…

python读取所有sheet内容到另一个文件中

实现效果&#xff1a; 将原excel中的步骤、预期效果列按回车拆成多行数据&#xff0c;其余字段值填充其他数据 实现结果&#xff1a; # This is a sample Python script.# Press ShiftF10 to execute it or replace it with your code. # Press Double Shift to search everyw…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别&#xff0c;有时候需要查看 WARN 级别的日志&#xff0c;所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

计算机与CFD模拟仿真:技术的融合与应用

计算机与CFD模拟仿真:技术的融合与应用 引言 随着科技的不断发展,计算机技术与计算流体力学(CFD)模拟仿真在各个领域的应用越来越广泛。本文将详细介绍计算机技术与CFD模拟仿真在各领域中的应用,包括航空航天、汽车设计、能源电力、环境工程等。通过深入探讨计算机技术与…

matplotlib可视化PCA后的重建图像及重建误差

代码 import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.datasets import fetch_olivetti_faces# 加载Olivetti人脸数据集 data fetch_olivetti_faces() X data.data images data.images# 设置不同的PCA组件数 comp…

ENVI植被指数阈值法

植被指数阈值法提取纯净像元 首先用ENVI打开无人机遥感影像 1. 假彩色显示 打开数据管理工具&#xff0c;无人机的4波段为红边波段 2. 波段计算 打开band math&#xff0c;输入 float(b1-b2)/(b1b2) 选择对应波段 3. 阈值筛选 阈值按经验值选的0.7&#xff0c;ndvi…

Linux:dockerfile编写搭建mysql练习(10)

搭建了httpyum仓库 Dockerfile 主要文件 基于centos基础镜像 centos.repo yum仓库 db_init.sh mysql初始化脚本 run.sh 启动脚本 vim Dockerfile写入FROM centosMAINTAINER teacher lyRUN mkdir /etc/yum.repos.d/bak ; mv /etc/yu…

一个可用于临床的食管癌远处转移预测模型(shiny APP)

一个可用于临床的食管癌远处转移预测模型&#xff08;APP&#xff09; 最近将之前构建的一个预测食管癌远处转移模型制作成了APP&#xff08;地址见文末&#xff09;&#xff0c;有一些思考&#xff0c;和大家分享如下&#xff1a; 1. 充分的说明 首先&#xff0c;对模型的…

Nacos与Eureka的区别

Nacos的服务实例分为两种l类型&#xff1a; 临时实例&#xff1a;如果实例宕机超过一定时间&#xff0c;会从服务列表剔除&#xff0c;默认的类型。非临时实例&#xff1a;如果实例宕机&#xff0c;不会从服务列表剔除&#xff0c;也可以叫永久实例。 配置一个服务实例为永久…

翻硬币(第四届蓝桥杯省赛C++B组)(java版)

//翻硬币,每次都会改变两个硬币的状态 //因此我们可以从前往后枚举,s1[i] 与 s2[i] 状态不同就改变它的状态 //同时s1[i 1] 与 s2[i 1] 的状态会因此改变 // 所以继续往下枚举s1[i 1] 与 s2[i 1] //因为题目有说必须有解,因此枚举到 n - 1位的时候&#xff0c;两个字符串的…

从印刷机到数据库:自动化如何提高生产力和改善生活

一文了解从自动化到数据库的前世今生。 作者&#xff1a;Kevin Kline 本文来源&#xff1a;https://www.dbta.com/&#xff0c;爱可生开源社区翻译。 本文约 2200 字&#xff0c;预计阅读需要 8 分钟。 自动化的历史 人类长期以来一直梦想着自动化的前景。我们最早的祖先将其想…

【C语言学习疑难杂症】第6期:C语言中如何打印一些特殊字符,比如打印扩展ascii码字符

首先我们来看下ascii表和ascii拓展表: ascii表中的字符只有128个,是从0-127,而拓展ascii表的内容是128-255。拓展表中它们都是一些特殊的字符,如果我们想答应ascii拓展码中的一些字符应该要怎么操作呢? 比如下面的代码: unsigned char a = 176, b = 219;printf("%…

音频/视频、信息和通信技术设备安全标准UL62368-1

UL 62368-1&#xff0c;第 3 版&#xff0c;2019 年 12 月 13 日- UL 音频/视频、信息和通信技术设备安全标准 - 第 1 部分&#xff1a;安全要求 IEC 62368 的这一部分适用于该领域内电气和电子设备的安全音频、视频、信息和通信技术&#xff0c;以及额定电压不超过 600 V 的商…

select选择框里填充图片,下拉选项带图片

遇到一个需求&#xff0c;选择下拉框选取图标&#xff0c;填充到框里 1、效果展示 2、代码 <el-form-item label"工种图标" class"Form_icon Form_label"><el-select ref"select" :value"formLabelAlign.icon" placeholder&…