JAVA 入坑教程 | 章节九 详解java的装箱和拆箱
来源:互联网 发布:淘宝网京东商城茅台酒 编辑:程序博客网 时间:2024/06/05 00:27
简单点,代码的方式简单点,装逼的方式请省略,我们又不是演员,别设计那些情节
什么是装箱?什么是拆箱?代码如何展示?
装箱过程是怎样的?拆箱过程是怎样的?
有问题可加入安卓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];
总结:装箱的过程会创建对象,这个肯定是消耗内存的,所以装箱的过程会增加内存的消耗,影响性能。
❤❤ . 分析第二句代码,直接来看它的源码
@Overridepublic 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 可以调用相应的方法
- 什么时候自动装箱?
- 什么时候自动拆箱?
相当于编译器自动为您作以下的语法编译: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的装箱和拆箱
- JAVA 入坑教程 | 章节一 基础概念
- JAVA 入坑教程 | 章节二 基本数据类型
- JAVA 入坑教程 | 章节三 变量类型
- JAVA 入坑教程 | 章节四 修饰符
- JAVA 入坑教程 | 章节五 运算符合集
- JAVA 入坑教程 | 章节六 循环结构体
- JAVA 入坑教程 | 章节七 条件分支结构
- JAVA 入坑教程 | 章节八 什么是Number 类?
- Java里的拆箱和装箱
- JavA的自动装箱和拆箱
- Java的自动拆箱和装箱
- java的自动装箱和拆箱
- java装箱和拆箱的记录
- java装箱和拆箱
- java装箱和拆箱
- java拆箱和装箱
- Java 装箱和拆箱
- Oracle 优化 ordered 和leading 使用
- HDU 2222 Keywords Search
- Web开发之CSS样式设置小技巧
- test
- 10分钟玩转JQ
- JAVA 入坑教程 | 章节九 详解java的装箱和拆箱
- thinkphp 安装memcache 以及测试(windows764位下)
- 并发系列文章
- 第一行代码笔记 全局获取context,定时任务,日志打印
- java基础.集合.properties.初识
- Android5 Lollipop 中关于 SELinux 安全机制调试笔记
- 访问maven项目总是报404
- Android杂谈(21)补坑+Path动画
- selenium+testng+gitblit+jenkins+ant自动化测试系列六:eclipse上传代码到服务器