简单点,代码的方式简单点,装逼的方式请省略,我们又不是演员,别设计那些情节
什么是装箱?什么是拆箱?代码如何展示?
装箱过程是怎样的?拆箱过程是怎样的?
有问题可加入安卓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句话即可。

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

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

  1. JAVA 入坑教程 | 章节二 基本数据类型

    JAVA 章节二 基本数据类型 目录 Java基本数据类型:两大类 内置数据类型 引用数据类型 Java类型的转换 自动类型转换 强制类型转换 Java的常量 Java基本数据类型 一.内置数据类型 ...

  2. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)

    windows命令行中java和javac.javap使用详解(java编译命令) 更新时间:2014年03月23日 11:53:15   作者:    我要评论 http://www.jb51.ne ...

  3. java中static修饰函数_详解java中static关键词的作用

    在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...

  4. java sort 第二个参数_详解java Collections.sort的两种用法

    Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式: public static > void sort(List list) { l ...

  5. java list for循环遍历_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  6. java 数组合并_拼接_详解Java合并数组的两种实现方式

    详解Java合并数组的两种实现方式 发布于 2020-7-27| 复制链接 摘记: 最近在写代码时遇到了需要合并两个数组的需求,突然发现以前没用过,于是研究了一下合并数组的方式,总结如下.1.Syst ...

  7. JAVA基础知识——方法的参数,特殊数据类型,装箱和拆箱...

    文章目录 一.方法的参数 二.特殊的数据类型 三.装箱和拆箱 三.Object 四.思维导图 一.方法的参数 我们常见的参数有: (1)基本数据类型作为参数 (2)可变参数(三个点-) (3)引用类型 ...

  8. java htmlparser 使用教程_HTMLParser使用详解(1)

    在研究搜索引擎的开发中,对于HTML网页的处理是核心的一个环节.网上有很多开源的代码,对于Java来说,HTMLParser是比较著名并且得到广泛应用的一个.HTMLParser的主页是http:// ...

  9. 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?

    Java IO概述 IO就是输入/输出.Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题.我们把数 ...

最新文章

  1. 二分法在算法题中的4种常见应用(cont.)
  2. 响应式布局设备分界点
  3. 【第44题】【062题库】2019年OCP认证062考试新题
  4. 京瓷m5021cdn如何设置扫描_京瓷产品让您轻松应对潮湿天气
  5. 单片机串口通信学号显示_触摸屏与单片机串口通信测试
  6. Java并发编程之synchronized关键字解析
  7. 阿里云java面试_20个高级Java面试题汇总
  8. 实例讲解遗传算法——基于遗传算法的自动组卷系统【实践篇】
  9. 中金财富:如何获取不“平均”的收益?
  10. python open函数用法_python中open函数的用法详解
  11. 基于单片机的智能窗帘系统设计(#0408)
  12. 小米笔记本linux无线网失效,小米笔记本无线网络打不开怎么办
  13. 3DCAT云流送技术如何搅动各大行业
  14. 英文版红帽linux设置屏保,Linux下屏保设置
  15. Linux | Shell 学习笔记(二)Shell 流程控制 if、case、for、while| read读取输入 | 函数的使用 | cut、sed、awk、sort命令 +Demo
  16. 06、江苏专转本(专业课笔记)第六章、信息系统与数据库
  17. 「隐藏功能」你必须知道的6个iOS小技巧...
  18. css图片动画主要知识点
  19. 节奏模仿练习——视唱练耳
  20. HyperAttentionDTI:基于注意机制的序列深度学习改进药物-蛋白质相互作用预测

热门文章

  1. windows系统修复
  2. g4560和二代i5_两款处理器奔腾G4560和i5-7400差距?
  3. 8个免费的高质量UI图标大全网站
  4. Java 使用JavaMail通过Gmail发送电子邮件
  5. Origin: 双Y轴 | 柱状图 | 折线图 | 垂线散点图的结合绘制
  6. The Sultan's Successors UVA - 167
  7. 高斯消元法解线性方程组(C++实现)
  8. 京东金融APP被曝侵犯隐私
  9. Lambda和Stream流
  10. python等于号怎么输入_python 中不等于怎么表示