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中的概念,而在在其他编程语言中,这些概念要么不存在,要么以不同的形式存在。

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

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

相关文章

旋转框检测项目相关python库知识总结

旋转框常用于检测带有角度信息的矩形框&#xff0c;即矩形框的宽和高不再与图像坐标轴平行。相较于水平矩形框&#xff0c;旋转矩形框一般包括更少的背景信息。旋转框检测常用于遥感等场景中&#xff0c;本博文简单的介绍了可应用于旋转框数据训练的开源库&#xff0c;数据结构…

Spring 七大组件

文章目录 Spring 七大组件 Spring 七大组件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean&#xff0c;它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式…

报错AttributeError: module ‘cv2‘ has no attribute ‘ximgproc‘

报错AttributeError: module ‘cv2’ has no attribute ‘ximgproc’ 首先查看是否安装opencv-contrib-python pip list | grep opencv显示 opencv-contrib-python 4.4.0.46 opencv-python 4.8.1.78 opencv-pyt…

Python 基础【五】--数据类型-序列【2023.11.24】

1.定义 Python 中的序列是一块可存放多个值的连续内存空间&#xff0c;所有值按一定顺序排列&#xff0c;每个值所在位置都有一个编号&#xff0c;称其为索引&#xff0c;我们可以通过索引访问其对应值。 list1 [Google, Runoob, 1997, 2000] list2 [1, 2, 3, 4, 5 ] list3…

【工具使用】Keil工具的使用——常用配置介绍

Keil调试具体教程学习 目录 ​​​​​​​Keil调试具体教程学习 常用功能总结 &#xff08;2&#xff09;目标设置&#xff08;Target&#xff09; ①设置晶振频率 ②跨模块优化选项 ③微库选项 &#xff08;3&#xff09;输出设置&#xff08;Output&#xff09; ①…

Java枚举详解

一、什么是枚举类型 枚举类型是一种特殊的数据类型&#xff0c;用于定义一组固定的命名常量。枚举类型提供了一种更强大、更安全和更易读的方式来表示一组相关的常量。 在Java中&#xff0c;枚举类型是通过使用enum关键字来定义的。枚举类型可以包含一个或多个枚举常量&#xf…

P1028 [NOIP2001 普及组] 数的计算

时刻记住一句话&#xff1a;写递归&#xff0c;1画图&#xff0c;2大脑放空&#xff01;&#xff01;&#xff01; 意思是&#xff0c;自己写递归题目&#xff0c;先用样例给的数据画图&#xff0c;然后想一个超级简单的思路&#xff0c;直接套上去就可以了。 上题干&#xff…

Theta*: Any-Angle Path Planning on Grids 原文翻译

Theta*: Any-Angle Path Planning on Grids 文章目录 Theta*: Any-Angle Path Planning on Grids翻译摘要1.Introduction2. Path-Planning Problem and Notation3. Existing Terrain Discretizations4.Existing Path-Planning Algorithms4.1 A* on GridsA* with Post-Smoothed …

EFAK-v3.0.1版部署与使用

一、前言 EFAK&#xff08;(Eagle For Apache Kafka&#xff0c;以前称为Kafka Eagle&#xff09;用于在使用 Topic 的情况下监控 Kafka 集群。包含Offset 的产生、Lag的变化、Partition的分布、Owner、Topic的创建以及修改的时间等信息。 二、环境&安装包 官方下载连接E…

2023年【R1快开门式压力容器操作】考试资料及R1快开门式压力容器操作复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R1快开门式压力容器操作考试资料参考答案及R1快开门式压力容器操作考试试题解析是安全生产模拟考试一点通题库老师及R1快开门式压力容器操作操作证已考过的学员汇总&#xff0c;相对有效帮助R1快开门式压力容器操作复…

运动鞋品牌识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

【Spring Boot 源码学习】自定义 Banner 信息打印

Spring Boot 源码学习系列 自定义 Banner 信息打印 引言往期内容主要内容1. ResourceBanner 打印1.1 添加默认的 banner.txt 资源文件1.2 指定任意路径的资源文件1.3 添加自定义的信息 2. ImageBanner 打印2.1 添加默认的图像资源文件2.2 指定任意路径的图像资源文件2.3 添加自…

网站监控是什么

在当今高度互联的世界中&#xff0c;网站已成为企业和个人成功的关键因素。无论是提供产品或服务&#xff0c;还是建立品牌形象&#xff0c;网站都是不可或缺的工具。然而&#xff0c;随着互联网用户对访问速度和用户体验的高要求&#xff0c;保持网站的稳定性和可用性变得至关…

旋转的数组

分享今天看到的一个题目&#xff0c;不同思路解法 题目 思路1&#xff1a;时间复杂度0(N*k&#xff09; void rotate(int *a,int N,int k)//N为数组元素个数 { while(k--) { int tema[N-1]; for(int rightN-2;right>0;right--) { a[right1]a[right]; } a[0]tem; …

Seata的部署和集成

文章目录 一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos配置 一、部署Seata的t…

静态web服务器开发之HTTP协议

文章目录 版权声明HTTP协议网址HTTPS补充&#xff1a;HTTP的无状态特性浏览器访问Web服务器流程HTTP协议请求报文HTTP GET请求报文分析POST请求方式要点总结 HTTP协议响应报文HTTP 响应报文分析HTTP 状态码要点总结 HTTP协议通信过程查看 版权声明 本博客的内容基于我个人学习…

矩阵论(Matrix)

​ 大纲 矩阵微积分&#xff1a;多元微积分的一种特殊表达&#xff0c;尤其是在矩阵空间上进行讨论的时候逆矩阵(inverse matrix)矩阵分解&#xff1a;特征分解&#xff08;Eigendecomposition&#xff09;&#xff0c;又称谱分解&#xff08;Spectral decomposition&#xf…

Spark SQL 时间格式处理

初始化Spark Sql package pbcp_2023.clear_dataimport org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{current_date, current_timestamp}object twe_2 {def main(args: Array[String]): Unit {val con new …

优秀的时间追踪软件Timemator for Mac轻松管理时间!

在现代社会&#xff0c;时间管理成为了我们工作和生活中的一大挑战。如果你经常感到时间不够用&#xff0c;无法高效地完成任务&#xff0c;那么Timemator for Mac将成为你的得力助手。 Timemator for Mac是一款出色的时间追踪软件&#xff0c;它可以帮助你精确记录和管理你的…

Codeforces Round 786 (Div. 3) D. A-B-C Sort

D. A-B-C Sort 步骤 1 &#xff1a;当 a不为空时&#xff0c;从 a中取出最后一个元素&#xff0c;并将其移动到数组 b的中间。如果 b 当前长度为奇数&#xff0c;则可以选择&#xff1a;将 a 中的元素放到 b 中间元素的左边或右边。结果&#xff0c; a 变空&#xff0c; b 由 n…