JDK--box和unbox

2019-04-28 08:24:47来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

目录

 

什么是装箱、拆箱

基本类型和包装类型

为什么会有基本类型?

为什么还要有包装类型

两者区别

两者互转

源码分析(JDK1.8版本)

valueOf方法

1.Integer、Short、Byte、Character、Long的valueOf方法

2.Double、Float的valueOf方法

xxxValue方法


什么是装箱、拆箱

装箱:把基本数据类型转换成对应的包装类型
拆箱:把包装类型转化成基本数据类型

基本类型和包装类型

java中提供了8中基本数据类型,每种基本类型都对应一种包装类型
?

为什么会有基本类型?

Java是面向对象编程的语言,而基本类型并不是对象,为什么会存在基本类型呢?

Java通过new创建对象,对象存储在堆里,我们通过栈中的引用来使用该对象。但Java中绝大部分对象是朝生夕死的,这样就会有大量对象的创建和回收,效率低下。所以对于频繁使用的一些类型,就不用关键字new来创建,直接将变量值存储在栈中更为高效。

为什么还要有包装类型?

既然基本类型那么高效,那为什么还要有它们的包装类型呢?

为了使基本类型具有对象特征,从而实现更多的功能。因为类能够提供必要的方法,用于实现基本数据类型的数值与String之间的转换,以及一些其他属性和方法; 另外,有些数据结构库类(如集合类型Collection、Map)只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。

两者区别

1. 声明方式不同:基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;
 
2. 存储方式及位置不同:基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;
 
3. 初始值不同:基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;
 
4. 使用方式不同:基本类型直接赋值直接使用就好,而包装类型在集合如Collection、Map时会使用到。

由于java提供了默认box unbox操作,所以在大数据和高并发场景下,需注意性能。

两者互转

基本类型转包装类型:valueOf()

包装类型换基本类型:xxxValue()  。(xxx代表对应的基本数据类型)

源码分析(JDK1.8版本)

valueOf方法

1.Integer、Short、Byte、Character、Long的valueOf方法

Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的(在某个范围内的数值的个数是有限的),以Integer为例

?

这行代码的意思是,如果int值在[-128, Integer.IntegerCache.high](Integer.IntegerCache.high一般为127)区间内,则直接从Integer.IntegerCache.cache里取,否则新创建一个对象。

接下来看看IntegerCache是怎样的

?

?

从这段代码可以看出,IntegerCache的作用就是预先创建并缓存一定范围内的Integer对象[-128, high],high值可以通过调整虚拟机系统参数来改变,但-128~127一定会被缓存。此处需注意:这表明通过装箱操作即valueOf方法得到的指定int值的包装对象,都是同一个对象,反之,则不是同一个对象。

2.Double、Float的valueOf方法

以Double为例

?

这表明通过装箱操作得到的每个Double对象都是不同的对象。

3.Boolean的valueOf方法

?

?

这表明通过装箱操作得到的所有true值的Boolean对象都是同一个对象,所有的false值的Boolean对象都是同一个对象。

xxxValue方法

?

包装类型通过value属性来保存基本类型的值。xxxValue方法直接返回value的值。


原文链接:https://www.cnblogs.com/codding/p/10782333.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:金三银四铜五铁六

下一篇:maven私服上传jar包