Java零基础入门--自动拆箱

news2024/9/17 7:14:03

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

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

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

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

Java零基础入门–自动拆箱

前言

在之前的文章中,我们介绍了Java中的自动装箱(autoboxing)特性。我们学习了如何将基本数据类型转换为对应的包装类对象,这使得基本数据类型与对象之间的转换变得简便。今天,我们将继续探讨与自动装箱密切相关的一个重要概念——自动拆箱(unboxing)。自动拆箱使得将包装类对象自动转换为基本数据类型变得轻而易举,这对于编写高效和简洁的Java代码至关重要。

摘要

本文将深入探讨Java中的自动拆箱机制。我们将从以下几个方面对自动拆箱进行详细介绍:

  • 自动拆箱的定义和工作机制。
  • 自动拆箱在实际开发中的应用。
  • 通过示例代码展示自动拆箱的实际效果。
  • 自动拆箱的优缺点分析。
  • 自动拆箱在不同场景下的应用示例。
  • 测试用例的设计与分析。

简介

自动拆箱是Java编程语言的一项重要特性,它允许将包装类对象自动转换回基本数据类型。这一特性在Java的装箱机制中扮演了重要角色,使得程序员在处理基本数据类型和包装类之间的转换时无需手动干预。自动拆箱与自动装箱相对,通过自动拆箱,我们可以轻松地将 IntegerDouble 等包装类对象转换为 intdouble 等基本数据类型。

概述

在Java中,自动拆箱由编译器自动处理。编译器在编译时会根据需要自动将包装类对象转换为基本数据类型。当我们将包装类对象赋值给基本数据类型变量时,编译器会自动完成这一转换过程。自动拆箱使得在对象和基本数据类型之间的转换变得无缝,简化了代码编写。

核心源码解读

以下是一个简单的自动拆箱示例:

public class UnboxingTest {
    public static void main(String[] args) {
        // 自动装箱
        Integer boxedInteger = 42;
        Double boxedDouble = 3.14;

        // 自动拆箱
        int unboxedInteger = boxedInteger; // 自动拆箱
        double unboxedDouble = boxedDouble; // 自动拆箱

        // 输出结果
        System.out.println("Boxed Integer: " + boxedInteger);
        System.out.println("Unboxed Integer: " + unboxedInteger);
        System.out.println("Boxed Double: " + boxedDouble);
        System.out.println("Unboxed Double: " + unboxedDouble);
    }
}
代码解读
  1. 自动装箱

    • 在代码开始处,我们将基本数据类型的值 423.14 自动装箱为 IntegerDouble 对象。这意味着 boxedIntegerboxedDouble 分别持有 423.14 的对象表示。
  2. 自动拆箱

    • 在赋值语句 int unboxedInteger = boxedInteger;double unboxedDouble = boxedDouble; 中,boxedIntegerboxedDouble 自动拆箱为基本数据类型 intdouble
  3. 输出结果

    • 最后,我们通过 System.out.println 打印包装类对象及其对应的基本数据类型值,以验证自动拆箱的结果。

案例分析

案例 1:处理用户输入

假设我们从用户输入中获取数据,并将其存储为包装类对象。在进行计算时,我们需要将这些包装类对象转换为基本数据类型。自动拆箱使得这一过程变得简单直观。例如:

import java.util.Scanner;

public class UserInputTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter an integer: ");
        Integer userInputInteger = scanner.nextInt(); // 用户输入的整数

        System.out.print("Enter a double: ");
        Double userInputDouble = scanner.nextDouble(); // 用户输入的浮点数

        // 自动拆箱
        int inputInt = userInputInteger;
        double inputDouble = userInputDouble;

        // 输出结果
        System.out.println("Entered Integer: " + inputInt);
        System.out.println("Entered Double: " + inputDouble);

        scanner.close();
    }
}

案例 2:计算平均值

在计算平均值时,我们通常会使用包装类来处理数据。自动拆箱使得将包装类对象转换为基本数据类型,进而进行计算变得非常方便。

public class AverageCalculator {
    public static void main(String[] args) {
        Integer num1 = 10;
        Integer num2 = 20;
        Integer num3 = 30;

        // 自动拆箱
        int sum = num1 + num2 + num3;
        double average = sum / 3.0;

        // 输出结果
        System.out.println("Sum: " + sum);
        System.out.println("Average: " + average);
    }
}

优缺点分析

优点

  1. 简化代码

    • 自动拆箱使得基本数据类型和包装类对象之间的转换变得透明,减少了显式的类型转换代码,使得代码更简洁。
  2. 提高可读性

    • 自动拆箱减少了代码中的冗余部分,使得代码更加易于理解和维护。

缺点

  1. 隐性转换

    • 自动拆箱是隐式完成的,有时可能会导致错误难以察觉。例如,当包装类对象为 null 时,自动拆箱会抛出 NullPointerException,这可能会导致程序崩溃。
  2. 性能开销

    • 尽管自动拆箱简化了代码,但频繁进行装箱和拆箱操作可能会带来性能开销,特别是在高性能要求的场景中。

类代码方法介绍及演示

Integer 类的方法

  • intValue():返回 Integer 对象的 int 值。
  • parseInt(String s):将字符串解析为 int 值。

Double 类的方法

  • doubleValue():返回 Double 对象的 double 值。
  • parseDouble(String s):将字符串解析为 double 值。

以下是一个演示这些方法的示例代码:

public class WrapperMethodsTest {
    public static void main(String[] args) {
        Integer boxedInteger = 123;
        Double boxedDouble = 45.67;

        // 使用 Integer 类的方法
        int intValue = boxedInteger.intValue();
        System.out.println("Integer value from intValue(): " + intValue);

        // 使用 Double 类的方法
        double doubleValue = boxedDouble.doubleValue();
        System.out.println("Double value from doubleValue(): " + doubleValue);

        // 使用 parseXXX 方法
        int parsedInt = Integer.parseInt("789");
        double parsedDouble = Double.parseDouble("89.01");

        System.out.println("Parsed Integer: " + parsedInt);
        System.out.println("Parsed Double: " + parsedDouble);
    }
}

测试用例

测试用例 1:自动拆箱验证

public class UnboxingTest {
    public static void main(String[] args) {
        Integer boxedInteger = 100;
        Double boxedDouble = 50.5;

        // 自动拆箱
        int unboxedInteger = boxedInteger;
        double unboxedDouble = boxedDouble;

        // 验证拆箱结果
        System.out.println("Unboxed Integer: " + unboxedInteger); // 100
        System.out.println("Unboxed Double: " + unboxedDouble); // 50.5
    }
}

测试用例 2:包装类方法验证

public class WrapperMethodsTest {
    public static void main(String[] args) {
        Integer boxedInteger = 456;
        Double boxedDouble = 78.9;

        // 使用包装类方法
        int intValue = boxedInteger.intValue();
        double doubleValue = boxedDouble.doubleValue();

        // 验证结果
        System.out.println("Integer value from intValue(): " + intValue); // 456
        System.out.println("Double value from doubleValue(): " + doubleValue); // 78.9
    }
}

测试结果预期

测试用例 1 结果

Unboxed Integer: 100
Unboxed Double: 50.5

测试用例 2 结果

Integer value from intValue(): 456
Double value from doubleValue(): 78.9

测试代码分析

测试用例1代码解析

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

下面是对 UnboxingTest 类的详细解析。这段代码展示了自动拆箱的基本用法,演示了如何将包装类对象自动转换为基本数据类型。

public class UnboxingTest {
    public static void main(String[] args) {
        Integer boxedInteger = 100;
        Double boxedDouble = 50.5;

        // 自动拆箱
        int unboxedInteger = boxedInteger;
        double unboxedDouble = boxedDouble;

        // 验证拆箱结果
        System.out.println("Unboxed Integer: " + unboxedInteger); // 100
        System.out.println("Unboxed Double: " + unboxedDouble); // 50.5
    }
}
代码解析
  1. 定义包装类对象

    Integer boxedInteger = 100;
    Double boxedDouble = 50.5;
    
    • boxedInteger 是一个 Integer 类型的对象,表示整数 100
    • boxedDouble 是一个 Double 类型的对象,表示浮点数 50.5
    • 这些对象通过自动装箱机制创建,其中 10050.5 是基本数据类型 intdouble 的值,Java 自动将它们封装成 IntegerDouble 对象。
  2. 自动拆箱

    int unboxedInteger = boxedInteger;
    double unboxedDouble = boxedDouble;
    
    • int unboxedInteger = boxedInteger;:这里的 boxedInteger 被自动拆箱成 int 类型的值 100。这是 Java 自动拆箱的示例,Java 编译器自动将 Integer 对象转换为 int 基本数据类型。
    • double unboxedDouble = boxedDouble;:这里的 boxedDouble 被自动拆箱成 double 类型的值 50.5。类似地,Java 自动将 Double 对象转换为 double 基本数据类型。
  3. 输出结果

    System.out.println("Unboxed Integer: " + unboxedInteger); // 100
    System.out.println("Unboxed Double: " + unboxedDouble); // 50.5
    
    • System.out.println("Unboxed Integer: " + unboxedInteger);:打印 unboxedInteger 的值,应输出 100
    • System.out.println("Unboxed Double: " + unboxedDouble);:打印 unboxedDouble 的值,应输出 50.5
自动拆箱的过程
  • 定义包装类对象:Java 自动创建了 IntegerDouble 对象。
  • 自动拆箱:在赋值操作中,Java 自动将包装类对象转换为基本数据类型。这种转换是由 Java 编译器在运行时自动处理的,因此程序员无需显式地调用拆箱方法。
  • 验证结果:打印拆箱后的结果,确认转换是否正确。

测试用例2代码解析

针对如上示例代码,这里我给大家详细的代码剖析下,以便于帮助大家理解的更为透彻,帮助大家早日掌握。

以下是对 WrapperMethodsTest 类的详细解析。这段代码演示了如何使用 IntegerDouble 类的包装类方法将包装类对象转换为基本数据类型。

public class WrapperMethodsTest {
    public static void main(String[] args) {
        Integer boxedInteger = 456;
        Double boxedDouble = 78.9;

        // 使用包装类方法
        int intValue = boxedInteger.intValue();
        double doubleValue = boxedDouble.doubleValue();

        // 验证结果
        System.out.println("Integer value from intValue(): " + intValue); // 456
        System.out.println("Double value from doubleValue(): " + doubleValue); // 78.9
    }
}
代码解析
  1. 定义包装类对象

    Integer boxedInteger = 456;
    Double boxedDouble = 78.9;
    
    • boxedInteger 是一个 Integer 类型的对象,表示整数 456
    • boxedDouble 是一个 Double 类型的对象,表示浮点数 78.9
    • 这些对象是通过自动装箱机制创建的。Java 自动将基本数据类型 intdouble 转换为相应的包装类对象。
  2. 使用包装类方法

    int intValue = boxedInteger.intValue();
    double doubleValue = boxedDouble.doubleValue();
    
    • boxedInteger.intValue():调用 Integer 类的 intValue() 方法,将 boxedInteger 对象中的 Integer 值转换为基本数据类型 int。返回值 intValue456
    • boxedDouble.doubleValue():调用 Double 类的 doubleValue() 方法,将 boxedDouble 对象中的 Double 值转换为基本数据类型 double。返回值 doubleValue78.9
  3. 输出结果

    System.out.println("Integer value from intValue(): " + intValue); // 456
    System.out.println("Double value from doubleValue(): " + doubleValue); // 78.9
    
    • System.out.println("Integer value from intValue(): " + intValue);:打印 intValue 的值,应该输出 456
    • System.out.println("Double value from doubleValue(): " + doubleValue);:打印 doubleValue 的值,应该输出 78.9

小结

本文详细介绍了Java中的自动拆箱(unboxing)机制,包括其定义、应用、优缺点和代码示

例。通过具体的示例和测试用例,我们验证了自动拆箱的工作机制,并探讨了其在实际开发中的应用场景。

总结

自动拆箱是Java编程语言中的一个重要特性,使得在对象和基本数据类型之间的转换变得更为简便。理解和掌握自动拆箱机制,有助于编写更高效、简洁的Java代码。希望本文的介绍能够帮助你更好地理解自动拆箱,并在实际编程中加以运用。

寄语

编程是探索和实践的过程,希望你在Java编程的旅程中不断前进,深入理解每一个编程概念,提升你的编程技能。愿你在编程道路上收获满满,写出更加优雅和高效的代码!

… …

文末

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

… …

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

wished for you successed !!!


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

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

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

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

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

相关文章

在Linux下查看HBA卡的速率和状态

平时在Linux下映射存储,都是映射哪台就给哪台插线,然后在存储端扫描WWPN,简单粗暴,没技术含量。当然,光交下也可以看。 1,查看当前卡的品牌,常用的卡有两种,Emulex和Qlogic。 lspc…

C语言 - 预处理详解(一)#预定义符号 ##define #undef

文章目录 前言 一、预定义符号 二、#define (一)、#define 定义的标识符 (二)、#define 定义的宏 (三)、#define 替换规则 (四)、# 和 ## 1、 # 的作用 2、## 的作用 (五)、带副作用的宏参数 (六)、宏和函数的对比 (七)、命名约定 三、#undef 总结 前言 路漫漫其修远兮&#…

C语言深度剖析--不定期更新的第五弹

const关键字 来看一段代码&#xff1a; #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下&#xff1a; 接下来我们在上面的代码做小小的修改&#xff1a; #include <stdio.h> int main() {const int a 1…

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口 int main(int argc, char *argv[]) {//…

IDA的安装和使用

IDA Pro&#xff08;简称 IDA&#xff0c;官网地址为 https://www.hex-rays.com/products/ida/&#xff09;是一个反编译器&#xff0c;同时具备调试器的功能。IDA Pro 的功能非常强大&#xff0c;几乎所有的逆向题目都需要用到它&#xff0c;因而也被称为「逆向神器」 IDA安装…

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在&#xff0c;则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串…

Data Filtering Network论文浅析

time2023-09paperhttps://arxiv.org/abs/2309.17425codehttps://huggingface.co/apple/DFN5B-CLIP-ViT-H-14-378org.Apple个人博客地址http://myhz0606.com/article/dfn Motivation 训练一个好的CLIP模型依赖大规模&#xff0c;高质量的训练数据。通过爬虫&#xff0c;可以很…

S7-1200与G120变频器CU240E-2控制单元通过353报文实现PN通信的基本方法

S7-1200与G120变频器CU240E-2控制单元通过353报文实现PN通信的基本方法 西门子报文353 PKW+PZD-2/2, 6个字中前4个字是PKW用,后2个字是PZD用, 结合以上内容, 可以知道第5个字是STW1控制字,第6个字是转速给定值(PLC输出);第5个字是ZSW1是状态字,第6个字是当前转速值(P…

LeetCode:快乐数(202)

目录 题目 代码思路 双指针 代码实现 题目 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 编写一个算法来判断一个数 n 是不是快乐数。 [ 快乐数 ] 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程…

ThinkPHP5 5.0.23-rce远程代码执行漏洞复现

漏洞描述 ThinkPHP是一款运用极广的PHP开发框架。其版本5中&#xff0c;由于框架对控制器名没有进行足够的检测&#xff0c;会导致在没有开启强制路由的情况下可执行任意方法&#xff0c;从而导致远程命令执行漏洞。 启动容器 docker-compose up -d 查看端口 docker ps 端口为…

【C++进阶】hash表的封装

文章目录 hash表哈希表的关键组成部分哈希表的优缺点优点&#xff1a;缺点&#xff1a; 常见应用场景 开放定址法实现hash表负载因子 (Load Factor)负载因子的意义负载因子的影响再散列 (Rehashing)示例 整体框架insertFinderasehash桶封装框架insertfinderase~HashTable() 总结…

从路径优化学习FastPlanner之B样条曲线平滑(二):FastPlanner中B样条曲线代码理解与解读

参考别人的博客学习 根据之前一章只是大致了解了B样条数学原理&#xff0c;实际读代码还有疑惑。 控制点是什么&#xff1f;和规划出的路径点什么关系&#xff1f; 控制点可以说我们规划出的路径点&#xff0c;即n等于轨迹点个数。也可以不是轨迹点&#xff0c;通过线性方程反解…

Einsum(Einstein summation convention)

Einsum&#xff08;Einstein summation convention&#xff09; 笔记来源&#xff1a; Permute和Reshape嫌麻烦&#xff1f;einsum来帮忙&#xff01; The Einstein summation convention is a notational shorthand used in tensor calculus, particularly in the fields of …

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议&#xff0c;有时候说的内容比较广需要引用多份的数据&#xff0c;我记录起来有一定难度&#xff0c;所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链…

9.7(QT.Day 1)

一、自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求&#xff1a;每行代码都有注释 【需要用到的图片或者动图&#xff0c;自己去网上找】 1.mywidget.h代码 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QIcon> //图…

C++之格式化日期时间为字符串(精确到毫秒)

C11中提供了获取时间的chrono库&#xff0c;但是格式化显示太方便&#xff1b;C11还提供了格式化时间iomanip库&#xff0c;通过其put_time方法可以格式化时间到秒&#xff0c;要显示毫秒&#xff0c;就需要自己处理了。 #include <chrono> #include <string> #in…

css flex与inline-flex的区别

1、flex与inline-flex布局&#xff0c;都是弹性布局&#xff0c;盒状容器布局。 Flex 布局是什么&#xff1f;_w3cschool 2、下面一个实例来说明一下&#xff1a; 有一个要求&#xff0c;要求item增多的时候&#xff0c;不会换行&#xff0c;并且container容器也会随时item的…

【机器学习】我小学二年级妹妹都能理解的线性回归算法

什么是线性回归&#xff1f; 我小学二年级的妹妹想用压岁钱买房子&#xff0c;售楼广告上写着100万可以买100的房子&#xff0c;200万可以买200的房子&#xff0c;但是我的妹妹觉得那些房子都太小了&#xff0c;想买300的房子&#xff0c;那她应该要花多少钱呢&#xff1f; 对…

DBMS-2.2 数据库设计(2)——数据库规范化设计理论

本文章的素材与知识来自李国良老师和冠宇老师。 依赖理论 对于关系数据库中的依赖&#xff0c;分为函数依赖、多值依赖和连接依赖。 一.函数依赖 1.函数依赖 &#xff08;1&#xff09;定义&#xff1a; &#xff08;2&#xff09;理解&#xff1a; 通俗地讲&#xff0c;…

【Linux】借命令行参数的引导,探索环境变量的奥秘

目录 1.命令行参数 1.1.概念&#xff1a; 1.2.利用命令行参数打造计算器&#xff1a; 2.环境变量 2.1.环境变量是什么&#xff1f; 2.2.有什么方法可以不用带路径&#xff0c;直接就可以运行自己的程序呢&#xff1f; 法一&#xff1a; 法二&#xff1a; 2.3.通过代码…