Java包装类的自动装箱拆箱使用以及详解

Java包装类的自动装箱拆箱使用以及详解

  • 一、Java包装类简介:
  • 二、Java中的自动拆箱:
  • 三、Java中的自动装箱:
  • 四、自动拆箱和装箱的作用:
    • 1. 类型转换的便利性:
    • 2. 泛型的支持:
    • 3. 集合类的支持:
    • 4. 方法的重载:

一、Java包装类简介:

  1. Java包装类是一组用于将基本数据类型转换为对象的类,它们位于java.lang包中。Java基本数据类型是非对象类型,例如int、float、boolean等,而包装类提供了一种将这些基本数据类型转换为对象的方式。

  2. Java包装类的主要目的是在需要使用对象而不是基本数据类型的情况下提供支持。例如,在集合类中,只能存储对象而不是基本数据类型。此时,可以使用包装类将基本数据类型转换为对应的对象,并将其存储在集合中。

Java包装类的常用包装类如下

包装类作用
Integer用于封装int类型的值。
Double用于封装double类型的值。
Float用于封装float类型的值。
Boolean用于封装boolean类型的值。
Character用于封装char类型的值。
Byte用于封装byte类型的值。
Short用于封装short类型的值。
Long用于封装long类型的值。
  1. 包装类提供了一些常用的方法,可以用于对基本数据类型进行操作,例如转换为字符串、比较大小等。此外,包装类还提供了一些静态方法,用于将字符串转换为对应的基本数据类型。
  2. Java包装类是一组用于将基本数据类型转换为对象的类,它们位于java.lang包中。包装类提供了将基本数据类型转换为对象的能力,以便在需要对象而不是基本数据类型的情况下使用。常用的包装类有Integer、Double、Boolean等。包装类提供了一些常用的方法,用于对基本数据类型进行操作。

二、Java中的自动拆箱:

在Java 1.4中,没有自动拆箱的功能,如果要将包装类对象转换为基本数据类型,需要显式调用包装类的方法进行拆箱操作。

在Java 1.5中,引入了自动拆箱(Unboxing)的特性。 自动拆箱使得在需要使用基本数据类型而实际上只有包装类对象时,编译器会自动进行拆箱操作,将包装类对象转换为基本数据类型。这样在代码编写和阅读上更加简洁和方便。

下面通过示例代码来详细说明自动拆箱的变化和使用:

// Java 1.4中手动进行拆箱操作
Integer num1 = new Integer(10); // 创建一个Integer对象
int num2 = num1.intValue(); // 调用intValue()方法进行拆箱操作
System.out.println(num2); // 输出结果为10// Java 1.5中自动拆箱的使用
Integer num3 = new Integer(20); // 创建一个Integer对象
int num4 = num3; // 自动拆箱操作,将Integer对象转换为int类型
System.out.println(num4); // 输出结果为20

可以看到,通过自动拆箱的特性,可以直接将包装类对象赋值给对应的基本数据类型变量,无需显式调用拆箱方法。

需要注意的是,自动拆箱也可能会出现空指针异常。 当包装类对象为null时,尝试进行自动拆箱操作就会抛出空指针异常。
例如:

Integer num5 = null;
int num6 = num5; // 自动拆箱操作,会抛出NullPointerException异常

因此,需要在使用自动拆箱时,确保包装类对象不为null,或者使用条件语句进行判断,避免出现空指针异常。

三、Java中的自动装箱:

自动装箱(Autoboxing)是指将基本数据类型自动转换为对应的包装类对象,而不需要显式调用包装类的构造方法。在Java中,自动装箱的主要目的是为了方便处理基本数据类型和包装类之间的转换。

自动装箱和拆箱是在编译器层面完成的,编译器会根据上下文自动进行装箱和拆箱操作,使得代码编写和阅读更加简洁和方便。

下面通过示例代码来详细说明自动装箱的使用:

// 自动装箱
int num1 = 10; // 定义一个基本数据类型
Integer num2 = num1; // 自动装箱操作,将int类型转换为Integer对象
System.out.println(num2); // 输出结果为10// 自动拆箱
Integer num3 = new Integer(20); // 创建一个Integer对象
int num4 = num3; // 自动拆箱操作,将Integer对象转换为int类型
System.out.println(num4); // 输出结果为20

在上述示例中,自动装箱操作发生在将基本数据类型赋值给包装类对象时。编译器会自动调用对应包装类的构造方法,将基本数据类型转换为包装类对象。

自动拆箱操作发生在将包装类对象赋值给基本数据类型时。编译器会自动调用对应包装类的拆箱方法,将包装类对象转换为基本数据类型。

需要注意的是,自动装箱和拆箱虽然方便,但也可能会引发一些性能问题。因为它们会引入额外的对象创建和销毁操作,可能会产生一些额外的开销。因此,在性能敏感的场景下,建议使用基本数据类型而非包装类。

总结起来,自动装箱和拆箱是在编译器层面完成的,通过编译器的处理,可以自动进行基本数据类型和对应包装类对象之间的转换,使得代码编写和阅读更加方便。

四、自动拆箱和装箱的作用:

自动装箱和拆箱的主要目的是为了方便处理基本数据类型和对应的包装类之间的转换。下面详细说明为什么需要进行自动拆箱和装箱:

1. 类型转换的便利性:

在Java中,基本数据类型和包装类是两种不同的类型,它们之间不能直接进行赋值或传递参数。通过自动装箱和拆箱,可以在需要使用包装类对象的地方直接使用基本数据类型,而无需手动进行类型转换。
下面是一个Java示例代码来演示基本数据类型和包装类之间的转换:

public class TypeConversionExample {public static void main(String[] args) {// 基本数据类型转换为包装类int intValue = 10;Integer integerValue = Integer.valueOf(intValue);System.out.println("intValue: " + intValue);System.out.println("integerValue: " + integerValue);// 包装类转换为基本数据类型double doubleValue = Double.parseDouble("3.14");System.out.println("doubleValue: " + doubleValue);// 自动装箱和拆箱Integer autoBoxing = 20; // 自动装箱int autoUnboxing = autoBoxing; // 自动拆箱System.out.println("autoBoxing: " + autoBoxing);System.out.println("autoUnboxing: " + autoUnboxing);}
}
  1. 在上面的示例中,首先将一个基本数据类型int转换为对应的包装类Integer,使用Integer.valueOf()方法进行转换。然后将包装类Integer转换为基本数据类型double,使用Double.parseDouble()方法进行转换。最后演示了自动装箱和拆箱的机制,通过直接赋值的方式将基本数据类型赋值给包装类,或者将包装类直接赋值给基本数据类型。
  2. 可以看到,通过类型转换,我们可以在基本数据类型和包装类之间进行相互转换,方便地在不同类型之间进行数据操作。同时,自动装箱和拆箱机制也使得在基本数据类型和包装类之间进行转换更加便捷。

2. 泛型的支持:

在泛型中,只能使用类对象,而不能使用基本数据类型。通过自动装箱和拆箱,可以方便地在泛型中使用基本数据类型,而无需手动进行类型转换。
下面是一个使用泛型的Java示例代码:

import java.util.ArrayList;
import java.util.List;public class GenericExample {public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");String firstPerson = names.get(0);String secondPerson = names.get(1);System.out.println("First person: " + firstPerson);System.out.println("Second person: " + secondPerson);}
}
  1. 在上面的示例中,首先创建了一个List对象names,其元素类型为String。然后通过add方法向集合中添加字符串元素。接着使用get方法获取集合中的元素,并将其赋值给String类型的变量。最后,将获取到的两个字符串变量打印出来。
  2. 可以看到,通过使用泛型,我们可以在编译时就确定集合中元素的类型,并在操作集合时获得类型安全的保证。这样,我们可以更加方便地在集合类中操作指定类型的元素。

3. 集合类的支持:

Java的集合类(如List、Set、Map等)只能存储对象,不能存储基本数据类型。通过自动装箱和拆箱,可以方便地将基本数据类型存储到集合中,而无需手动进行类型转换。
下面是一个使用集合类和自动装箱的Java示例代码:

import java.util.ArrayList;
import java.util.List;public class CollectionExample {public static void main(String[] args) {List<Integer> numbers = new ArrayList<>();// 添加元素时自动装箱numbers.add(10); // int -> Integernumbers.add(20); // int -> Integer// 访问元素时自动拆箱int firstNumber = numbers.get(0); // Integer -> intint secondNumber = numbers.get(1); // Integer -> intSystem.out.println("First number: " + firstNumber);System.out.println("Second number: " + secondNumber);}
}
  1. 在上面的示例中,首先创建了一个List对象numbers,其元素类型为Integer。然后通过add方法向集合中添加元素,这时编译器会自动将int类型的参数装箱为Integer对象。接着使用get方法获取集合中的元素,这时编译器会自动将Integer对象拆箱为int类型。最后,将获取到的两个int类型的变量打印出来。
  2. 可以看到,通过自动装箱和拆箱,我们可以直接将基本数据类型的值添加到集合中,并在需要时将集合中的元素转换回基本数据类型。这样,我们可以更加方便地在集合类中操作基本数据类型的值。

4. 方法的重载:

在方法的重载中,如果只有基本数据类型和对应包装类的方法签名不同,那么编译器会自动选择合适的方法。通过自动装箱和拆箱,可以方便地进行方法的重载,提高代码的可读性和灵活性。
下面是一个简单的Java示例代码来说明这一点:

public class BoxingExample {public static void printNumber(int num) {System.out.println("Printing int: " + num);}public static void printNumber(Integer num) {System.out.println("Printing Integer: " + num);}public static void main(String[] args) {int a = 10;Integer b = 20;printNumber(a); // 自动装箱,调用printNumber(Integer num)方法printNumber(b); // 调用printNumber(Integer num)方法}
}
  1. 在上面的示例中,定义了两个重载的方法printNumber,一个接收int类型参数,一个接收Integer类型参数。在main方法中,首先定义了一个int类型的变量a和一个Integer类型的变量b。然后分别调用printNumber方法,并传入这两个变量。由于Java的自动装箱机制,编译器会自动将int类型的变量a装箱为Integer对象,然后选择调用printNumber(Integer num)方法。

  2. 可以看到,通过自动装箱的机制,我们可以直接将基本数据类型和包装类进行混合使用,并且编译器会自动选择适合的方法。这样,我们可以更加方便地使用基本数据类型和包装类进行方法的重载。

  3. 需要注意的是,虽然自动装箱和拆箱提供了方便,但也可能会引发一些性能问题。因为它们会引入额外的对象创建和销毁操作,可能会产生一些额外的开销。因此,在性能敏感的场景下,建议使用基本数据类型而非包装类。

  4. 总结起来,自动装箱和拆箱提供了方便的类型转换功能,使得基本数据类型和对应包装类之间的转换更加简洁和方便。它们在泛型、集合类和方法的重载等场景下尤为重要。但在性能敏感的场景下,需要谨慎使用,避免不必要的性能开销。

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

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

相关文章

【论文阅读】TransCAM: Transformer Attention-based CAM Refinement for WSSS

分享一篇阅读的用于弱监督分割的论文 论文标题&#xff1a; TransCAM: Transformer Attention-based CAM Refinement for Weakly Supervised Semantic Segmentation 作者信息&#xff1a; 代码地址&#xff1a; https://github.com/liruiwen/TransCAM Abstract 大多数现有…

【React】- 组件生命周期连续渲染两次问题

最近在整理生命周期相关的知识内容&#xff0c;然后发现一个奇怪的现象&#xff0c;即组件的生命周期会运行2次&#xff01;经过确认不是代码问题&#xff0c;于是开始找度娘&#xff0c;终于找到其原因-React中的严格模式&#xff0c;在这里记录一下 一、问题重现 如图所示&a…

EMC学习笔记(十五)射频PCB的EMC设计(二)

射频PCB的EMC设计&#xff08;二&#xff09; 1.滤波1.1 电源和控制线的滤波1.2 频率合成器数据线、时钟线、使能线的滤波 2.接地2.1 接地分类2.2 大面积接地2.3 分组就近接地2.4 射频器件接地2.5 接地时应该注意的问题2.6 接地平面的分布 1.滤波 1.1 电源和控制线的滤波 随着…

Ubuntu切换内核

一、下载指定内核 1.1查看当前内核 使用uname -a 命令可知当前内核为5.4.0-149-generic&#xff0c;根据需要安装指定内核5.4.0-139-generic uname -a Linux adyonggan-u01 5.4.0-149-generic #156~18.04.1-Ubuntu SMP Wed Jan 25 15:56:22 UTC 2023 x86_64 x86_64 x86_64 GN…

人工智能自然语言处理:N-gram和TF-IDF模型详解

人工智能自然语言处理&#xff1a;N-gram和TF-IDF模型详解 1.N-gram 模型 N-Gram 是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作&#xff0c;形成了长度是 N 的字节片段序列。 每一个字节片段称为 gram&#xff0c;对所…

SpringBoot 整合redis + Aop防止重复提交 (简易)

1.redis的安装 redis下载 解压 安装 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make 看一下就会有 进入redis-6.0.8下的src目录 [rootVM-16-8-centos redis]# cd redis-6.0.8 [rootVM-16-8-centos re…

HCIP——HCIA回顾及静态实验

HCIP HCIA一、知识回顾1、OSI七层参考模型&#xff1a;2、重要的几个协议报头格式 二、静态实验1、实验拓扑图2、实验要求3、实验思路4、实验步骤1、给接口划分IP地址以及配置环回地址2、交换机配置划分VLAN3、配置静态路由4、配置DHCP服务5、测试6、优化 HCIA 1、七层参考模型…

ng+php架构下websocket监听实例

系统架构&#xff1a;nginx服务器应用服务器数据库 通过websocket监听应用服务器的8090端口&#xff1b;前端js发送websocket请求到ng服务器&#xff1b;ng服务器转发请求到应用服务器的8090端口 1、php后端设置websocket监听 $_ip取应用服务器ip $_port为监听的端口 启动…

51单片机学习--独立按键控制LED

功能&#xff1a;按下K1时D1亮&#xff0c;松开时D1灭&#xff0c;P3_1对应K1 , P2_0对应D1 #include <REGX52.H>void main() {while(1) {if(P3_1 0) //按下K1{P2_0 0;}else{P2_0 1;}}} 按下按钮和松开按钮时会有抖动&#xff0c;所以需要用延时函数来避免抖动造成的…

短视频抖音账号矩阵系统源码开发分享

引用&#xff1a;MySQL数据库&#xff0c;NGINX&#xff0c;PHP7.4&#xff0c;MySQL5.7&#xff0c;redis 媒体组件 组件 描述 image 图片 图片。支持 JPG、PNG、SVG、WEBP、GIF 等格式。 video 视频 视频组件。相关 API 请参考 tt.createVideoContext。 开发背景&…

手机快充协议

高通:QC2.0、QC3.0、QC3.5、QC4.0、QC5.0、 FCP、SCP、AFC、SFCP、 MTKPE1.1/PE2.0/PE3.0、TYPEC、PD2.0、PD3.0/3.1、VOOC 支持 PD3.0/PD2.0 支持 QC3.0/QC2.0 支持 AFC 支持 FCP 支持 PE2.0/PE1.1 联发科的PE&#xff08;Pump Express&#xff09;/PE 支持 SFCP 在PP…

计算机网络——三次握⼿、四次挥手

TCP 三次握手 1、第⼀个SYN报⽂&#xff1a; 客户端随机初始化序列号client_isn&#xff0c;放进TCP⾸部序列号段&#xff0c; 然后把SYN置1。把SYN报⽂发送给服务端&#xff0c;表⽰发起连接&#xff0c; 之后客户端处于SYN-SENT状态。 2、第⼆个报⽂SYNACK报⽂&#xff1a; …

MQTT协议在物联网环境中的应用及代码实现解析(一)

MQTT协议全称是Message Queuing Telemetry Transport&#xff0c;翻译过来就是消息队列遥测传输协议&#xff0c;它是物联网常用的应用层协议&#xff0c;运行在TCP/IP中的应用层中&#xff0c;依赖TCP协议&#xff0c;因此它具有非常高的可靠性&#xff0c;同时它是基于TCP协议…

TCP/IP协议是什么?

78. TCP/IP协议是什么&#xff1f; TCP/IP协议是一组用于互联网通信的网络协议&#xff0c;它定义了数据在网络中的传输方式和规则。作为前端工程师&#xff0c;了解TCP/IP协议对于理解网络通信原理和调试网络问题非常重要。本篇文章将介绍TCP/IP协议的概念、主要组成部分和工…

深度学习 / 数据处理:如何处理偏态数据

1 前言 当我们使用一个线性回归模型时&#xff0c;通常这个模型是在很大假设的前提下才有一个很好的结果&#xff1a; 1、假设预测因子和预测目标之间的关系是线性的2、数据不存在外在噪声&#xff1a;不存在一些极端的数据3、非共线性&#xff08; collinearity&#xff09;…

利用弱监督学习实现从单张图像到图像集的准确3D人脸重建:PyTorch和Python的深度实践

在这篇文章中&#xff0c;我将带你走进3D人脸重建的世界&#xff0c;并介绍如何使用弱监督学习从单张图像或图像集中准确重建3D人脸。我们将使用Python和PyTorch&#xff0c;一种广泛用于深度学习的开源框架&#xff0c;来实现这一目标。 一、概述 3D人脸重建是计算机视觉领域…

新增进程管理、SSH会话管理功能,1Panel开源面板v1.4.0发布

2023年7月17日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.4.0版本。 在这个版本中&#xff0c;1Panel新增了进程管理和SSH会话管理功能&#xff1b;支持容器编辑和升级&#xff0c;数据库兼容MySQL 5.6&#xff1b;备份账号可以添加微软OneDrive&…

github简单使用

留个链接等着吃灰 链接github的使用 举例 先选择需要上传的文件夹 比如db -main文件夹 gitbash 打开shell 进行如下的操作 一般都得写的东西 git init git remote add origin 想要上传的地址 git pull 将远程库拉过来 如果远程没有文件的话 那么shell就显示没有文件 git …

【Vue】 在 vue 中使用 iframe 挂载 html 文件

文章目录 首先需要将要挂载的html文件放到public 文件夹中 路径的引用形式 <iframe ref"sheet" src"/luckysheet.html" width"100%" height"100%"></iframe>通过绑定 ref 获取到 iframe&#xff0c;data为我需要传递的数…

Vscode自定义注释模板

首先安装插件Doxygen Documentation Generator&#xff0c;安装完成之后点击Doxygen插件的设置&#xff0c;按照下面的步骤打开settings.json进行编辑&#xff1a; 在settings.json中追加如下代码&#xff1a; "doxdocgen.file.copyrightTag": ["Copyright (C),…