惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
小众软件
小众软件
I
InfoQ
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Martin Fowler
Martin Fowler
月光博客
月光博客
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
V
Visual Studio Blog
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research

Xudong's Blog

AI杀死了个人博客 让MDC在各种线程间穿梭自如 新手选购微单的策略 一些让Python代码更快的技巧 HTTP报文结构 Python日志库logging总结 写定向爬虫时遇到的问题 Java中的协变与逆变 给Hexo主题添加LaTeX公式支持 Python3中的Iterator与Iterable Rss订阅源分享 Git Tips Redis的数据库与持久化 Redis中的数据结构 控制反转与依赖注入 Vim命令笔记 Java中的equals和hashCode方法 Java中对象域的初始化 Hello, world. 使用Hexo搭建静态博客
Java中的基本类型和自动装拆箱
Xudong Sun · 2018-10-02 · via Xudong's Blog

基本数据类型及包装类

Java中的基本数据类型有byte、short、int、long、float、double、boolean、char。这几个类型都有其对应的包装类,表格中清晰展示了它们对应的包装类:

简单类型 二进制位数 封装类
boolean 1 Boolean
byte 8 Byte
char 16 Character
short 16 Short
int 32 Integer
long 64 Long
float 32 Float
doubel 64 Double
void Void

对于数值类型的基本类型的取值范围,以常量的形式定义在对应的包装类中了。如:
基本类型byte,二进制位数:Byte.SIZE 最小值:Byte.MIN_VALUE 最大值:Byte.MAX_VALUE

两者区别

基本类型和包装类都有各自的优势,较为突出的区别是,基本类型和C/C++中的变量一样储存在栈中,而包装类由于是会生成对象,自然是在堆区申请空间,效率不如栈。
但包装类带来的优势就是面向对象给我们带来的优势,大多数时候我们使用的依然是包装类,特别在涉及到容器时。

创建包装类对象

基本数据的包装类对象的创建可以像其他对象一样简单

1
Float float_a = new Float(3.1415E4);

但是,注意第4行,一个int型常量被直接赋值给了一个包装类对象。

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void boxing_unboxing(){
Integer int_1 = new Integer(1024);
Integer int_2 = 1024;
Integer[] list_1 = {1024, int_1, int_2};

System.out.println(list_1[0]);
System.out.println(list_1[1]);

System.out.println(list_1[0].getClass().getName());
System.out.println(list_1[1].getClass().getName());
}

显然,第二行的这种语法大大简化了包装类对象的创建。
但是方便不止体现在创建时,如果我们在一个规定好类型(Integer)的数组里,或者在一种java容器中直接放入一个基本类型,它将会自动被“转换成”包装类,这种转换并不是类似C中的强制类型转换,而是通过Integer类的构造函数真正地构造了一个对象。
我们省去了创建一个对象的繁杂语法,便可以直接使用一个包装类。

事实上,上面的函数里最后两句打印是没有必要的,因为从这个数组中取出的每个元素必定是Integer类的对象,java是类型严格的,因为我们只能在对象上调用getClass()方法,显然数字1024在被放入数组时就已经被 自动装箱 成它对应的包装类了。

理解自动装箱后,自动拆箱 就很简单了:

1
int i = new Integer(1024);

一个Integer对象在刚被new出来以后,就直接被赋值给了int类型的变量i,包装类被直接转换成了其对应的基本类型。

自动拆装箱的原理

那么,自动拆装箱时如何实现的呢?其实通过反编译java的字节码文件可以得出结论。在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。