JAVA 入坑教程 | 章节九 详解java的装箱和拆箱

简介: 简单点,代码的方式简单点,装逼的方式请省略,我们又不是演员,别设计那些情节 什么是装箱?什么是拆箱?代码如何展示? 装箱过程是怎样的?拆箱过程是怎样的? 有问题可加入安卓QQ群: 246231638装箱和拆箱的概念简单点,代码的方式简单点,装...

简单点,代码的方式简单点,装逼的方式请省略,我们又不是演员,别设计那些情节
什么是装箱?什么是拆箱?代码如何展示?
装箱过程是怎样的?拆箱过程是怎样的?
有问题可加入安卓QQ群: 246231638


装箱和拆箱的概念

简单点,代码的方式简单点,装逼的方式请省略,我们又不是演员,别设计那些情节:

//自动装箱
Integer total = 9999;

//自动拆箱
int totalprim = total;
  • 装箱:就是自动将基本数据类型转换为包装器类型;
  • 拆箱:就是自动将包装器类型转换为基本数据类型;

我们来看下Number类的结构图:

深圳市米奇云科技有限公司

不清楚的可以看:《JAVA 入坑教程 | 章节八 什么是Number 类?》



各自所占用的字节

深圳市米奇云科技有限公司




拆箱和装箱的过程



.我们还是用代码来说话,我们用一个DuTest的Demo来测试下拆箱和装箱的过程

package test;

public class DuTest {
    public static void main(String[] args) {        
        Integer total = 99; //自动装箱      
        int totalAll = total;//自动拆箱     
        System.out.println(totalAll);
    }
}

我们用 javap -c DuTest 来编译这个类,如下图:

深圳市米奇云科技有限公司

可以看到,
第一句:系统上执行了Integer.valueOf();
第二句:系统帮我们执行了 Integer.intValue();

. 分析第一句Integer.valueOf()的源码:

public static Integer valueOf(int i) {
    return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
private final int value;

public Integer(int value) {
    this.value = value;
}

public Integer(String string) throws NumberFormatException {
    this(parseInt(string));
}

传入一个int类型的value,如果是 String则执行parseInt方法,有人会看到valueOf里面有个数组SMALL_VALUES[i + 128],其实它是个静态方法来的

private static final Integer[] SMALL_VALUES = new Integer[256];

总结:装箱的过程会创建对象,这个肯定是消耗内存的,所以装箱的过程会增加内存的消耗,影响性能。


. 分析第二句代码,直接来看它的源码

@Override
public int intValue() {
    return value;
}

分析第二句可以看出,它是直接返回了对象,不做其余的操作。

不过这里需要注意的是:Double类型的装箱和拆箱是不同的,可以看到Double代码里面

public static Double valueOf(double d) {
    return new Double(d);
}

通过查看这些基本数据类型的源码可以看出:
Integer:Integer、Short、Byte、Character、Long这些类的valueOf方法是直接返回对象。
Double:Double、Float的valueOf方法都是返回一个新的对象。


装箱和拆箱详细概念

  • 什么是自动装箱拆箱

      • 基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。
      • 一般我们要创建一个类的对象实例的时候,我们会这样:
        Class a = new Class(parameter);
        当我们创建一个Integer对象时,却可以这样:
        Integer i = 100; (注意:不是 int i = 100; )
        实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100);
        这就是基本数据类型的自动装箱功能。
  • 基本数据类型与对象的差别

      • 基本数据类型:不是对象,也就是int、double、boolean等定义的变量、常量。
      • 基本数据类型:没有可调用的方法。
      • Integer 可以调用相应的方法


  1. 什么时候自动装箱?
  2. 什么时候自动拆箱?

相当于编译器自动为您作以下的语法编译:Integer i = Integer.valueOf(100);
自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:

  Integer i = 10; //装箱 
 int t = i; //拆箱,实际上执行了 int t = i.intValue();
   
//在进行运算时,也可以进行拆箱。
Integer i = 10; 
System.out.println(i++);




个人理解,大家也可以这样去记:

  • 装箱:从小往大
  • 拆箱:从大往小

这样比较好记,在代码开发中记住这2句话即可。


|| 版权声明:本文为博主杜锦阳原创文章,转载请注明出处。

相关文章
|
13天前
|
存储 Java 编译器
Java基础教程(五千字带你快速入门!)(二)
Java基础教程(五千字带你快速入门!)(二)
|
13天前
|
存储 安全 Java
Java基础教程(五千字带你快速入门!)(一)
Java基础教程(五千字带你快速入门!)(一)
|
3天前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
21 6
|
20小时前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
【7月更文挑战第12天】在本文中,作者宏哥介绍了如何在不使用PageFactory的情况下,用Java和Selenium实现Page Object Model (POM)。文章通过一个百度首页登录的实战例子来说明。首先,创建了一个名为`BaiduHomePage1`的页面对象类,其中包含了页面元素的定位和相关操作方法。接着,创建了测试类`TestWithPOM1`,在测试类中初始化WebDriver,设置驱动路径,最大化窗口,并调用页面对象类的方法进行登录操作。这样,测试脚本保持简洁,遵循了POM模式的高可读性和可维护性原则。
11 2
|
5天前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
【7月更文挑战第9天】在Java项目中,使用Logback配置可以实现日志按照不同包名输出到不同的文件,并且根据日志级别分开记录。
20 4
|
5天前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)
【7月更文挑战第8天】这篇教程介绍了如何使用Logback将Java应用的日志输出到文件中。首先,通过创建`logback.xml`配置文件,设置`FileAppender`来指定日志文件路径和格式。然后,提供了一个`RollingFileAppender`的例子,用于每日生成新的日志文件并保留一定天数的历史记录。文中包含配置文件的XML代码示例,并展示了控制台输出和生成的日志文件内容。教程最后提到了一些可能遇到的问题及解决建议。
15 0
《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)
|
10天前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
【7月更文挑战第3天】TestNG教程展示了如何自定义日志记录。首先创建一个名为`TestLog`的测试类,包含3个测试方法,其中一个故意失败以展示日志。使用`Assert.assertTrue`和`Reporter.log`来记录信息。接着创建`CustomReporter`类,继承`TestListenerAdapter`,覆盖`onTestFailure`, `onTestSkipped`, 和 `onTestSuccess`,在这些方法中自定义日志输出。
27 6
|
6天前
|
Java 关系型数据库 测试技术
《手把手教你》系列基础篇(八十九)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-上篇(详解教程)
【7月更文挑战第7天】Apache Log4j2的安全漏洞促使考虑使用logback作为替代的日志框架。Logback由log4j创始人设计,提供更好的性能,更低的内存使用,并且能够自动重载配置文件。它分为logback-core、logback-classic(实现了SLF4J API)和logback-access(用于Servlet容器集成)三个模块。配置涉及Logger、Appender(定义日志输出目的地)和Layout(格式化日志)。
15 1
|
9天前
|
Java 测试技术 Apache
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
【7月更文挑战第4天】Apache Log4j 是一个广泛使用的 Java 日志框架,它允许开发者控制日志信息的输出目的地、格式和级别。Log4j 包含三个主要组件:Loggers(记录器)负责生成日志信息,Appenders(输出源)确定日志输出的位置(如控制台、文件、数据库等),而 Layouts(布局)则控制日志信息的格式。通过配置 Log4j,可以灵活地定制日志记录行为。
25 4
|
2天前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
【7月更文挑战第11天】页面对象模型(POM)通过Page Factory在Java Selenium测试中被应用,简化了代码维护。在POM中,每个网页对应一个Page Class,其中包含页面元素和相关操作。对比之下,非POM实现直接在测试脚本中处理元素定位和交互,代码可读性和可维护性较低。