JDK--box和unbox
目录
1.Integer、Short、Byte、Character、Long的valueOf方法
什么是装箱、拆箱
装箱:把基本数据类型转换成对应的包装类型
拆箱:把包装类型转化成基本数据类型
基本类型和包装类型
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的值。