Java拆箱与装箱
基本数据类型和包装类
Java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double、boolean、char;
基本数据类型 | 包装类 | 字节数 | 位数 | 范围 | 默认值 | |
---|---|---|---|---|---|---|
整形 | byte | Byte | 1 | 8 | -127,128 | 0 |
sort | Sort | 2 | 16 | -2^15,2^15-1 | 0 | |
int | Integer | 4 | 32 | -2^31,2^31-1 | 0 | |
long | Long | 8 | 64 | -2^63,2^63-1 | 0L | |
浮点型 | float | Float | 4 | 32 | 0.0f | |
double | Double | 8 | 64 | 0.0d | ||
布尔型 | boolean | Boolean | 1 | 8 | true,false | true |
字符型 | char | Character | 2 | 16 | 一个字符 | '\u0000'转化为int为0 |
为什么需要基本数据类型
Java是一门面向对象的语言,万事万物都是对象。在Java中我们需要new来创建一个对象,这个对象会储存在堆里,通过栈中的引用指向这些对象。但是对于这些我们经常使用的数据类型这样的做法不是很高效,所以Java引入了基本数据类型将这些变量直接保存在栈中。
为什么需要包装类
基本数据类型不属于类,它们没有类的性质。为了让基本数据类型拥有类的性质,Java为每一个基本数据类型提供了它们的包装类,使得它们有类的性质。这些包装类提供了许多属性和方法,丰富了基本数据类型的操作,使得程序员使用更方便,开发更高效。
装箱与拆箱
- 自动装箱 基本数据类型——>包装类(原理是调用了valueOf方法)
- 自动拆箱 包装类——>基本数据类型 (原理是调用了xxxValue方法)
1 | //装箱 |
Integer的valueOf方法的具体实现
1 | private static class IntegerCache { |
从这段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。
下面是一个例子
1 | public class Test1 { |
输出结果为
1 | true |
上面的代码中i1和i2的数值为50,小于缓存大小,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则是分别指向不同的对象。
Integer的intValue方法的具体实现
1 | /** |
Integer类中value属性存放了Integer对象的值,intValue方法直接返回value的值就可以了。
Boolean的valueOf方法的具体实现
1 | /** |
下面有个例子
1 | public class Test1 { |
输出结果为
1 | true |
布尔型在装箱时调用valueOf方法返回的都是一个Boolean对象的索引。
Boolean的booleanValue方法的具体实现
1 | /** |
通过查看其它类的该方法的源码之后,可以得到该表:
包装类 | vauleof |
---|---|
Byte | 缓存(-128,127),且byte值的范围也是(-128,127) |
Short | 缓存(-128,127) |
Integer | 缓存(-128,127) |
Long | 缓存(-128,127) |
Float | 没有缓存,new一个对象 |
Double | 没有缓存,new一个对象 |
Boolean | 直接返回,不new |
Character | 缓存(0,127) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 FizzyElf | Blog!
评论