深入探究Java自动拆箱与装箱的实现原理

news2024/11/18 11:29:05

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

Java是目前最常用的编程语言之一,它具有简单易学、跨平台、面向对象等优点,被广泛应用于各种应用开发中。在Java的基础语法中,自动拆箱和装箱是常见的概念,本文将详细介绍这两个概念的含义、应用场景和优缺点。

摘要

本文主要介绍Java中的自动拆箱和装箱概念。自动拆箱是将封装类型的变量自动转换为基本类型的变量,而自动装箱则是将基本类型的变量自动转换为封装类型的变量。本文将详细介绍这两个概念的含义、应用场景和优缺点。

自动拆箱和装箱

简介

Java中的自动拆箱和装箱是由JDK1.5引入的新特性。在Java中,有8种基本数据类型:byte、short、int、long、float、double、char和boolean,而为了保证Java的完全面向对象性质,Java又为每个基本数据类型提供了对应的封装类型:Byte、Short、Integer、Long、Float、Double、Character和Boolean。自动拆箱和装箱的概念主要涉及到基本类型的变量和封装类型的变量之间的转换。

源代码解析

自动拆箱

在Java中,自动拆箱是将封装类型的变量自动转换为基本类型的变量。自动拆箱是在编译器中自动完成的,不需要开发者手动进行。

下面是一个自动拆箱的示例:

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中的应用场景非常广泛,下面列举几个常见的例子:

  1. 数组的元素必须是基本类型的变量,因此如果需要将封装类型的变量存放到数组中,就需要进行自动拆箱操作。
Integer[] arr1 = {1, 2, 3};
int[] arr2 = {new Integer(1), new Integer(2), new Integer(3)};
  1. 将封装类型的变量传递给参数为基本类型的方法时,需要进行自动拆箱操作。
public void print(int num) {
    System.out.println(num);
}
Integer i = new Integer(10);
print(i);

自动装箱

自动装箱也有一些常见的应用场景,下面列举几个例子:

  1. 自动装箱可以方便地将基本类型的变量转换为对应的封装类型,便于在面向对象的编程中使用。
int i = 10;
Integer j = i;
  1. 在调用泛型方法时,需要将基本类型的变量转换为对应的封装类型,以便能够使用集合类型。
public <T> void printList(List<T> list) {
    for (T t : list) {
        System.out.println(t);
    }
}
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
printList(list);

优缺点分析

优点

自动拆箱和装箱能够方便地将基本类型的变量和封装类型的变量进行转换,使得Java在面向对象编程中更加完整。

缺点

自动拆箱和装箱的操作需要在编译期进行转换,因此会在一定程度上影响程序的性能。

类代码方法介绍

下面是一个封装了自动拆箱和装箱的类AutoBoxing,包括两个方法autoUnboxing和autoBoxing:

public class AutoBoxing {
    public static int autoUnboxing(Integer i) {
        return i;
    }
    
    public static Integer autoBoxing(int i) {
        return i;
    }
}

方法autoUnboxing接收一个封装类型的变量i,返回一个基本类型的变量。方法autoBoxing接收一个基本类型的变量i,返回一个封装类型的变量。

测试用例

测试代码演示

下面是一个使用AutoBoxing的测试用例:

package com.example.javase.se.classes.packaging;

/**
 * @Author ms
 * @Date 2023-11-05 19:03
 */
public class test {

    public static void main(String[] args) {
        AutoBoxing test = new AutoBoxing();
        test.autoUnboxing(1);
        test.autoBoxing(2);
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

这是一个Java程序的源代码,包名为com.example.javase.se.classes.packaging,类名为test。它包含了一个名为main的静态方法,该方法的参数为String数组args。

在main方法中,先创建了一个AutoBoxing类的实例test。然后分别调用了该实例的autoUnboxing和autoBoxing方法,并向这两个方法传入了整数类型的参数1和2。

程序的具体功能需要查看AutoBoxing类的代码。这是一个Java程序的源代码,包名为com.example.javase.se.classes.packaging,类名为test。它包含了一个名为main的静态方法,该方法的参数为String数组args。

在main方法中,先创建了一个AutoBoxing类的实例test。然后分别调用了该实例的autoUnboxing和autoBoxing方法,并向这两个方法传入了整数类型的参数1和2。

程序的具体功能需要查看AutoBoxing类的代码。

全文小结

本文主要介绍了Java中的自动拆箱和装箱概念,包括它们的含义、应用场景以及优缺点分析。通过示例代码和测试用例,展示了自动拆箱和装箱的操作方式及其效果。

总结

自动拆箱和装箱是Java编程中常见的操作,利用它们能够方便地实现基本类型和封装类型之间的转换。但是,这种操作也会影响程序的性能,因此在实际编程中需要注意它们的使用。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

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

相关文章

浙江大学数据结构MOOC-课后习题-第九讲-排序2 Insert or Merge

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 刚开始我打算想推出一个规律&#xff0c;来判断是否是归并排序&#xff0c;但实在太过于复杂&#xff0c;我很难去想出这样的规律…因此&#xff0c;参考了其他博主的思路——每做一次排…

AI菜鸟向前飞 — LangChain系列之十五 - Agent系列:从现象看机制(中篇)一个Agent的“旅行”

Agent基本架构 先谈谈Agent基本架构概念&#xff0c;如果看得云里雾里&#xff0c;等看完本篇之后&#xff0c;再回头看就会豁然开朗的&#xff0c;而我尽量写得更易懂&#xff1a; &#xff09; 这里面会穿插着上一篇的内容&#xff0c;请大家记得往回翻翻&#xff0c;传送门&…

Vue.js中如何实现以列表首列为表头

前言 一般情况table列表的展示&#xff0c;列头都在第一横行&#xff0c;此方法用于列头在第一列的情况。 效果图 核心代码 <template><div><table class"data-table"><tr v-for"(column, columnIndex) in columns" :key"col…

maven部署到私服

方法一:网页上传 1、账号登录 用户名/密码 2、地址 http://自己的ip:自己的端口/nexus 3、查看Repositories列表&#xff0c;选择Public Repositories&#xff0c;确定待上传jar包不在私服中 4、选择3rd party仓库&#xff0c;点击Artifact Upload页签 5、GAV Definition选…

MagicPose4D:解锁AI驱动的3D模型动作新纪元

在当今快速发展的数字内容创作领域,MagicPose4D正以其革命性的技术颠覆传统动画制作流程,成为创作者手中的魔法棒。这款先进的框架不仅仅是一款工具,更是通往无限创意的一扇门,它使得为3D模型赋予生动、自然的动作变得前所未有的简单和高效。下面,让我们深入探索MagicPose…

STM32高级控制定时器(STM32F103):检测输入PWM周期和占空比

目录 概述 1 PWM 输入模式 1.1 原理介绍 1.2 应用实例 1.3 示例时序图 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM占空比函数 3.2 输入捕捉回调函数 4 功能测试 4.1 测试软件框架结构 4.2 实验实现 4.2.1 测试实…

Redis介绍及安装配置

1 什么是Redis Redis 的定义&#xff1a;Redis&#xff08;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 可见Redis和我们最经常使用的MySQL都…

动态规划之买卖股票大集合

目录 引言 1.只能进行一次买卖股票&#xff08;最多只能买一股股票&#xff09; 2.可以进行多次股票买卖&#xff0c;且没有手续费&#xff08;最多只能买一股股票&#xff09; 3.可以进行多次股票买卖&#xff0c;但是有冷冻期&#xff0c;无手续费&#xff08;最多只能买一…

Firefox浏览器网页上的按钮点击无效解决办法

我在github下点下载经常不好使&#xff0c;查了原因&#xff0c;原来是浏览器的问题。在Firefox浏览器的设置里面&#xff0c;去掉一些cookies的禁用即可。之后&#xff0c;就可以点击按钮成功响应了。

智能跳绳的产品体验与思考(一)

我&#xff0c;虽称不上跳绳高手&#xff0c;却对这项运动怀有深厚的热爱&#xff0c;也曾在某电商平台上选购过一款智能跳绳&#xff0c;希望能借此提升我的跳绳技巧。今天&#xff0c;咱们就来聊聊我和这条绳子的发生的一些故事&#xff0c;外加我的一些思考。 此刻&#xf…

NDIS协议驱动(四)

NDIS 定义对象标识符 (OID) 值&#xff0c;以标识适配器参数&#xff0c;其中包括设备特征、可配置设置和统计信息等操作参数。 协议驱动程序可以查询或设置基础驱动程序的操作参数。 NDIS 还为 NDIS 6.1 及更高版本的协议驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支…

Java-文件操作

一、创建文件 1.创建文件夹 创建文件夹时&#xff0c;注意两个条件&#xff0c;该路径对应的是否为目录&#xff08;dir&#xff09;&#xff0c;该文件夹是否存在。 File Apathnew File("./文件夹A"); //当前路径文件夹的存储路径if(!Apath.exists() &&am…

【研0深度学习】李宏毅2024春《生成式人工智能导论》持续更新...

文章目录 第1讲 什么是生成式人工智慧&#xff1f;第2讲 今日的生成式人工智慧厉害在哪里&#xff1f;第3-5讲 训练不了人工智慧&#xff0c;你可以训练你自己&#xff08;在不训练模型的情况下强化语言模型的方法&#xff09;第6讲 大模型修炼史——第一阶段 自我学习 累计实力…

ROS2入门21讲__第08讲__话题:节点间传递数据的桥梁

目录 前言 通信模型 发布/订阅模型 多对多通信 异步通信 消息接口 案例一&#xff1a;Hello World话题通信 运行效果 发布者代码解析 程序实现 流程总结 订阅者代码解析 程序实现 流程总结 案例二&#xff1a;机器视觉识别 运行效果 发布者代码解析 订阅者代…

WebGL学习(一)渲染关系

学习webgl 开发理解渲染关系是必须的&#xff0c;也非常重要&#xff0c;很多人忽视了这个过程。 我这里先简单写一下&#xff0c;后面尽量用通俗易懂的方式&#xff0c;举例讲解。 WebGL&#xff0c;全称Web Graphics Library&#xff0c;是一种在网页上渲染3D图形的技术。它…

FPGA时钟:驱动数字逻辑的核心

一、引言 在FPGA&#xff08;现场可编程门阵列&#xff09;设计中&#xff0c;时钟信号是不可或缺的关键要素。时钟信号作为时序逻辑的心跳&#xff0c;推动着FPGA内部各个存储单元的数据流转。无论是实现复杂的逻辑运算还是处理高速数据流&#xff0c;都需要精确的时钟信号来保…

CASS11自定义宗地图框

1、找到CASS11的安装路径&#xff0c;找到如下文件夹&#xff1a; 2、打开【report】文件夹&#xff0c;如下&#xff1a; 3、打开其中一个压缩包&#xff0c;如【标准宗地图】压缩包&#xff0c;结果如下&#xff1a; 4、打开后&#xff0c;将其另存为到桌面&#xff0c;随后关…

Leetcode621. 任务调度器

Every day a Leetcode 题目来源&#xff1a;621. 任务调度器 类似题目&#xff1a;1953. 你可以工作的最大周数 解法1&#xff1a;贪心 本质上来说&#xff0c;我们需要构造一个尽量短的&#xff0c;相同元素间隔 > (n1) 的序列。 用一个数组 cnt 统计每个任务的次数。…

Oracle创建用户时提示ORA-65096:公用用户名或角色名无效

Oracle创建用户时提示“ORA-65096&#xff1a;公用用户名或角色名无效” 如下图所示&#xff1a; 解决方法&#xff1a;在新增用户名前面加上C##或者c##就可以解决无效问题&#xff0c;具体什么原因还不清楚&#xff0c;需要再研究一下。

Discourse 安装后安全配置考虑

防火墙 防火墙是肯定要装机器上的&#xff0c;并且端口只开放了 443 和 22。 22 的端口还只限制了部分 IP 段的访问&#xff0c;通常只允许给内部网络的 SSH。 Web 服务应该只走 443&#xff0c;80 端口的做好自动重定向到 443。 CloudFlare 可以用一个 CloudFlare 的负载…