Java自动装箱(autoboxing)和自动拆箱(autounboxing)介绍

Java自动装箱(autoboxing)和自动拆箱(autounboxing)介绍

先回顾一下 Java 中的基本数据类型和包装类。

基本数据类型(Primitive Data Types): Java 提供了一组基本数据类型,有8种基本数据类型:byte、short、int、long、float、double、char和boolean。

数据类型

取值范围

byte

-128 ~ 127

short

-32786 ~ 32767

int

-4294967296 ~ 4294967295

long

-2^64^ ~ 2^64^ -1

float

3.4e-038 ~ 3.4e+038

double

1.7e-308 ~ 1.7e+308

char

\u0000 ~ \uffff

boolean

true 、false

包装类(Wrapper Classes): 为了使基本数据类型具备面向对象的特性,Java 提供了对应的包装类,Byte、Short、Integer、Long、Float、Double、Character和Boolean。这些包装类用于将基本数据类型封装为对象,以便进行更多的操作。

Java自动装箱和拆箱的意思就是 Java 编译器自动处理基本数据类型与包装类之间的转换,使程序员无需手动编写繁琐的代码。自动装箱和自动拆箱也可以简称为装箱和拆箱。

Java中基础数据类型与它们对应的包装类见下表(共8种):

原始类型

包装类型

boolean

Boolean

byte

Byte

char

Character

float

Float

int

Integer

long

Long

short

Short

double

Double

当表格中左边列出的基础类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或拆箱。

  • 进行 = 赋值操作(装箱或拆箱)
  • 进行+,-,*,/混合运算 (拆箱)
  • 进行>,<,==比较运算(拆箱)
  • 调用equals进行比较(装箱)
  • ArrayList,HashMap等集合类 添加基础类型数据时(装箱)

一个自动拆箱的示例:

Integer i = new Integer(10);

int j = i;

在这个示例中,将一个封装类型的变量i赋值给一个基本类型的变量j,编译器会自动将i转换为int类型的数值10,然后赋值给j。

一个自动装箱的示例:

int i = 10;

Integer j = i;

在这个示例中,将一个基本类型的变量i赋值给一个封装类型的变量j,编译器会自动将i转换为Integer类型的对象,然后赋值给j。

在Java中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是从Java 5开始引入的概念,它们是编译器的特性,使得原始类型(primitive types)和它们对应的包装类(wrapper classes)之间的转换自动化。

public class Demo {
    public static void main(String[] args) {
    //自动装箱
    Integer total = 99;

    //自动拆箱
    int totalprim = total;
    }
}

自动装箱(Autoboxing

自动装箱是指将原始类型自动转换为对应的包装类对象的过程。当编译器遇到一个原始类型的值,而该值需要被当作一个对象来处理时,编译器会自动将原始类型的值转换为对应的包装类对象。这通常发生在:

  1. 将原始类型赋值给对应的包装类变量时。
  2. 将原始类型传递给期望对象的方法时。
  3. 将原始类型添加到集合中,如List或Set,这些集合只能存储对象。

例如:

Integer integerObject = 10; // 自动装箱,int转换为Integer

List<Integer> listOfIntegers = new ArrayList<>();

listOfIntegers.add(20); // 自动装箱,int转换为Integer

在上面的例子中,数字10和20是原始类型int,它们被自动装箱成为Integer对象,然后被存储在对应的变量和集合中。

自动拆箱(Unboxing

自动拆箱是指将包装类对象自动转换为对应的原始类型值的过程。当编译器遇到一个包装类对象,而该对象需要被当作一个原始类型的值来处理时,编译器会自动将包装类对象转换为原始类型的值。这通常发生在:

  1. 将包装类对象赋值给对应的原始类型变量时。
  2. 将包装类对象传递给期望原始类型的方法时。
  3. 在算术运算或比较运算中使用包装类对象时。

例如:

Integer integerObject = new Integer(30);

int i = integerObject; // 自动拆箱,Integer转换为int

在上面的例子中,integerObject是一个Integer对象,它被自动拆箱成为int原始类型的值i。

注意事项

虽然自动装箱和拆箱使得原始类型和包装类之间的转换变得简单,但它们也可能引入一些问题:

  1. 性能开销:装箱操作涉及到对象的创建,而拆箱操作可能涉及到类型检查和值的提取。频繁的装箱和拆箱可能会对性能产生负面影响,特别是在大量计算的场景中。
  2. 空指针异常(NullPointerException):自动拆箱时如果包装类对象为null,则会抛出空指针异常。
  3. 等价性问题:包装类对象是引用类型,因此在比较时,使用==运算符会比较引用而不是值。为了比较值,应该使用equals()方法。

例如:

Integer a = 1000, b = 1000;

System.out.println(a == b); // false,因为比较的是引用

System.out.println(a.equals(b)); // true,因为比较的是值

但是,对于在-128到127之间的小整数值,Java会缓存这些对象的实例,所以使用==运算符比较这些值时可能会得到true。

Integer c = 100, d = 100;

System.out.println(c == d); // true,因为小整数值的实例被缓存

了解这些细节对于编写正确和高效的Java代码是非常重要的。

进一步学习了解可参见:

如何理解Java中的自动拆箱和自动装箱?https://www.cnblogs.com/niceyoo/p/12977541.html

详解Java的自动装箱与拆箱(Autoboxing and unboxing)https://www.cnblogs.com/wang-yaz/p/8516151.html

深入探究Java自动拆箱与装箱的实现原理https://cloud.tencent.com/developer/article/2361504

附录、C++、Java、Python、JavaScript等语言中都有自动装箱和自动拆箱概念吗?

自动装箱和自动拆箱是编程语言中的两个概念,主要与类型系统有关,尤其是在处理基本数据类型和它们的对象表示(包装类)时出现。

  1. C++:C++中没有自动装箱和自动拆箱的概念。C++是一种静态类型语言,不提供基本数据类型和对象之间的自动转换。C++中有类似的概念,比如构造函数和类型转换运算符,可以用来在对象和基本数据类型之间进行转换,但这些都需要显式定义。
  2. Java:Java中有自动装箱和自动拆箱的概念。从Java 5开始,Java提供了自动装箱和自动拆箱功能,使得基本数据类型和它们的包装类(如int和Integer、double和Double等)之间可以自动转换。
  3. Python:Python中没有自动装箱和自动拆箱的概念,因为Python是一种动态类型语言,它不区分基本数据类型和对象类型。在Python中,数字、字符串等都是对象。
  4. JavaScript:JavaScript也是一种动态类型语言,它有类似自动装箱的行为,但通常不这么称呼。在JavaScript中,基本数据类型(如数字、字符串、布尔值)在需要时会被自动封装为对象(例如,当你调用基本类型的方法时)。然而,这个过程是透明的,开发者通常不需要关心这个自动转换。
  5. C#语言的自动装箱和自动拆箱与Java语言中的这两个概念非常类似。在C#中,装箱和拆箱是用于在值类型(如结构体和基本数据类型)和引用类型(如object或者接口类型)之间转换的过程。

总的来说,自动装箱和自动拆箱主要是Java中的概念,而在在其他编程语言中,这些概念要么不存在,要么以不同的形式存在。

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

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

相关文章

【教3妹学编程-算法题】统计和小于目标的下标对数目

2哥 : 3妹&#xff0c;OpenAI的宫斗剧迎来了大结局&#xff01;OpenAI宣布阿尔特曼复职CEO&#xff0c;董事会重组 3妹&#xff1a;啊&#xff1f;到底谁才是幕后操纵者啊&#xff0c;有咩有揪出来 2哥 : 也不是很清楚&#xff0c;据说在被开除的几周前&#xff0c;前CEO曾谴责…

jQuery_04 jQuery选择器应用

jQuery中的选择器 1.基本选择器 1.1 id $("#id值") id名称 1.2 class $(".class值") class名称 1.3 标签选择器 $("标签名字") 标签名称 1.4 所有选择器 $("*") 所有标签 1.5 组合选择器 …

ArkTS-自定义组件学习

文章目录 创建自定义组件页面和自定义组件生命周期自定义组件和页面的区别页面生命周期(即被Entry修饰的组件)组件生命周期(即被Component修饰的组件) Builder装饰器&#xff1a;自定义构建函数按引用传递参数按值传递参数 BuilderParam装饰器&#xff1a;引用Builder函数 这个…

IO口速度影响了什么?

我们在初学单片机的时候都知道单片机GPIO的作用是巨大的&#xff0c;在配置GPIO的时候&#xff0c;结构体初始化里有一个选项是配置输入输出速度的&#xff0c;对于这个速度输出是必须要配置的&#xff0c;输入没有明令说明需不需要配置。 这个速度对于学习过32单片机的都应该知…

汽车电子 -- 根据DBC解析CAN报文

采集的CAN报文&#xff0c;怎么通过DBC解析呢&#xff1f;有一下几种方法。 首先需要确认是CAN2.0 还是CAN FD报文。 还有是 实时解析 和 采集数据 进行解析。 一、CAN2.0报文实时解析&#xff1a; 1、CANTest工具 使用CAN分析仪 CANalyst-II&#xff0c;采集CAN报文。 使用…

XG916Ⅱ轮式装载机后驱动桥设计机械设计CAD

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;装载机 获取完整论文报告工程源文件 本次设计内容为XG916Ⅱ装载机后驱动桥设计&#xff0c;大致上分为主传动的设计&#xff0c;差速器的设计&#xff0c;半轴的设计&#xff0c;最终传动的设计四大部分。其中主传动锥齿轮…

【element优化经验】el-dialog修改title样式

目录 前言 解决之路 1.把默认的这个图标隐藏&#xff0c;官方的api有这个属性&#xff1a;showClose值设置false. 2.title插槽定制&#xff1a;左边定制标题&#xff0c;右边定制按钮区域。 3.背景颜色修改&#xff1a;默认title是有padding的需要把它重写调&#xff0c;然…

(Matalb时序预测)GA-BP遗传算法优化BP神经网络的多维时序回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码 四、本文代码数据说明手册分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台编译&am…

uniapp适配微信隐私协议开发指南[uniapp+vue3+js]

没怎么做过uniapp&#xff0c;找了一些文章做了出来&#xff0c;给大家分享一下 2023.9.15以后需要适配微信的隐私协议开发指南 目前uniapp的说法是微信小程序隐私协议开发指南 | uni-app官网 微信小程序小程序隐私协议开发指南 | 微信开放文档 微信官方提供了几个demo 完…

【Java 进阶篇】Jedis:让Java与Redis轻松对话的利器

在现代软件开发中&#xff0c;缓存系统是提高系统性能的常见手段之一&#xff0c;而Redis作为一个高性能的缓存数据库&#xff0c;被广泛应用于各类系统。如果你是Java开发者&#xff0c;那么使用Jedis库可以让你轻松地与Redis进行交互。本文将带你深入了解Jedis的快速入门&…

微服务实战系列之Nginx

前言 Nginx&#xff1f;写了那么多文章&#xff0c;为什么今天才轮到它的表演&#xff1f;那是因为它实在太重要了&#xff0c;值得大书特书&#xff0c;特别对待。 当我们遇到单点瓶颈&#xff0c;第一个idea是&#xff1f;Nginx&#xff1b; 当我们需要反向代理&#xff0c;…

游戏测试大揭秘,帮你轻松过关!

游戏测试可以看作是软件测试的一个分支&#xff0c;黑盒测试最基本的要求是会玩游戏。小公司会要求测试能力更加全面的员工&#xff0c;其中除了功能测试还要会性能测试&#xff0c;兼容测试&#xff0c;弱网测试&#xff0c;自动化测试等。 游戏测试是游戏开发过程中必不可少…