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句话即可。


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

相关文章
|
9天前
|
IDE Oracle Java
java基础教程(1)-Java概述和相关名词解释
【4月更文挑战第1天】Java是1995年Sun Microsystems发布的高级编程语言,以其跨平台特性著名。它介于编译型和解释型语言之间,通过JVM实现“一次编写,到处运行”。Java有SE、EE和ME三个版本,分别针对标准、企业及嵌入式应用。JVM是Java虚拟机,确保代码在不同平台无需重编译。JRE是运行环境,而JDK包含开发工具。要安装Java开发环境,可从Oracle官网下载JDK,设置JAVA_HOME环境变量并添加到PATH。
|
1月前
|
Java
Java String split()方法详细教程
Java String split()方法详细教程
20 0
|
1月前
|
Web App开发 Java 测试技术
《手把手教你》系列基础篇之(四)-java+ selenium自动化测试- 启动三大浏览器(下)基于Maven(详细教程)
【2月更文挑战第13天】《手把手教你》系列基础篇之(四)-java+ selenium自动化测试- 启动三大浏览器(下)基于Maven(详细教程) 上一篇文章,宏哥已经在搭建的java项目环境中实践了,今天就在基于maven项目的环境中给小伙伴们 或者童鞋们演示一下。
62 1
|
1月前
|
Web App开发 Java 测试技术
《手把手教你》系列基础篇之(三)-java+ selenium自动化测试- 启动三大浏览器(上)(详细教程)
【2月更文挑战第12天】《手把手教你》系列基础篇之(三)-java+ selenium自动化测试- 启动三大浏览器(上)(详细教程) 前边宏哥已经将环境搭建好了,今天就在Java项目搭建环境中简单地实践一下: 启动三大浏览器。按市场份额来说,全球前三大浏览器是:IE.Firefox.Chrome。因此宏哥这里主要介绍一下如何启动这三大浏览器即可,其他浏览器类似的方法,照猫画虎就可以了。
40 1
|
17天前
|
Web App开发 前端开发 Java
《手把手教你》系列技巧篇(九)-java+ selenium自动化测试-元素定位大法之By name(详细教程)
【4月更文挑战第1天】 这篇教程介绍了如何使用Selenium Webdriver通过name属性来定位网页元素,作为系列教程的一部分,之前讲解了id定位,后续还会有其他六种定位方法。文中以百度搜索为例,详细说明了定位搜索框(name=&quot;wd&quot;)并输入关键词“北京宏哥”的步骤,包括手动操作流程、编写自动化脚本以及代码实现。此外,还提供了查看和理解Selenium源码的方法,强调了`open implementation`选项用于查看方法的具体实现。整个过程旨在帮助读者学习Selenium的元素定位,并实践自动化测试。
38 0
|
29天前
|
Web App开发 存储 JavaScript
《手把手教你》系列技巧篇(八)-java+ selenium自动化测试-元素定位大法之By id(详细教程)
【2月更文挑战第17天】本文介绍了Web自动化测试的核心——元素定位。文章首先强调了定位元素的重要性,指出找不到元素则无法进行后续操作。Selenium提供八种定位方法,包括By id、name、class name等。其中,By id是最简单快捷的方式。文章还阐述了自动化测试的步骤:定位元素、操作元素、验证结果和记录测试结果。此外,讨论了如何选择定位方法,推荐优先使用简单稳定的方式,如id,其次考虑其他方法。最后,作者提供了Chrome浏览器的开发者工具作为定位元素的工具,并给出了通过id定位的代码示例。
51 0
|
13天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(十二)-java+ selenium自动化测试-元素定位大法之By link text(详细教程)
【4月更文挑战第4天】本文介绍了link text在自动化测试中的应用。Link text是指网页中链接的文字描述,点击可跳转至其他页面。文章列举了8种常用的定位方法,其中着重讲解了link text定位,并通过实例展示了如何使用Java代码实现点击百度首页的“奥运奖牌榜 最新排名”链接,进入相应页面。如果link text不准确,则无法定位到元素,这说明linkText是精准匹配,而非模糊匹配。文章还提到了partial link text作为link text的模糊匹配版本,将在后续内容中介绍。
35 4
|
11天前
|
XML 前端开发 Java
《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)
【4月更文挑战第6天】按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。
42 0
|
30天前
|
Web App开发 安全 Java
《手把手教你》系列技巧篇(七)-java+ selenium自动化测试-宏哥带你全方位吊打Chrome启动过程(详细教程)
【2月更文挑战第16天】本文介绍了如何通过查看源码理解Selenium启动Chrome浏览器的过程。首先,展示了启动Chrome的Java代码,包括设置系统属性、创建WebDriver实例、最大化窗口、设置隐性等待、打开网站、获取页面标题以及关闭浏览器。文章还讲解了包(package)、import导入、setProperty设置系统属性、WebDriver接口、driver实例、manage方法、get方法加载网页以及quit方法退出浏览器的基本概念和作用。适合没有Java基础的读者了解Selenium与Java的交互方式。
45 3
|
2天前
|
Java 测试技术 定位技术
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。
24 0