开发者社区> 奥特曼超人> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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


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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java - 装箱 / 拆箱(下)
Java - 装箱 / 拆箱(下)
0 0
Java - 装箱 / 拆箱(上)
Java - 装箱 / 拆箱(上)
0 0
java-基础-装箱与拆箱
八种基本数据类型的大小,以及他们的封装类。 八种基本数据类型,int ,double ,long ,float, short,byte,character,boolean 对应的封装类型是:Integer ,Double ,Long ,Floa...
760 0
[Java开发之路](23)装箱与拆箱
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50991203 1. 简介 大家对基本数据类型都非常熟悉,例如 int、float、double、boolean、char 等。
676 0
新手学JAVA(四)----装箱与拆箱
<div class="markdown_views"> <hr> <h2 id="一-什么是装箱什么是拆箱">一 什么是装箱?什么是拆箱?</h2> <hr> <p><font size="4">在Java中,Java对每种基本数据类型都提供了对象的包装器类型。看下表:</font></p> <p>                                    
1036 0
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
0 0
+关注
奥特曼超人
KARL-Dujinyang-奥特曼超人。作者目前任职于银狐、泡椒游戏公司,曾任职腾为CTO,CSDN技术专家,曾创办过创业go、造梦工厂、米奇云,万能孵化器等,领域涉及逆向安全专家以及全栈工程师,作者目前出书中。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA 应用排查全景图
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载