首先,讨论一下什么是包装类.包装类是一个统称,指的并不是一个类,而是一些类.包装类是针对于基本数据类型而产生的类.所以有几个基本数据类型,就有基本包装类.
其产生的原因就是为了更加方便的去操作基本数据类型.提高对基本数据类型操作的功能性.
基本数据类型 --> 包装类 : 可以具备功能
基本数据 --> 对象 :可以调用方法,增强其操作性.
以Integer类为例:
第一种情况:通过new对象获取:
只要使用new出来的Integer对象,无论值是否一样,那么对象的地址值都是不一样的.
如图:
第二种情况:通过自动装箱获取
在-128到127之间的数值,通过自动装箱获取的Integer对象,相同的值获取的对象地址值是一样的.
如图:
我们主要来讲解一下第二种情况,为什么通过自动装箱之后在(byte)取值范围之间的相同数值获取的对象是一致的.
首先,我们要知道Integer使用的是哪个方法实现的自动装箱功能.
如图可以得知通过Integer中的valueOf()方法,是可以能够实现装箱功能,而且相同的10装箱之后的地址值也是相同的.
而且如果超出了byte取值范围,相同的值包装成对象之后地址值就不再相同.和我们之间的结论是一致的.那么我们可以理解,Integer自动装箱其实调用的是valueOf()功能实现的.
想要知道具体的原因,那么就必须看valueOf()方法的源码如何实现的;
在valueOf()源码中,我们可以看到如果在某个范围之间的数值,会在指定的数组中获取Integer对象.那么我们先在***讨论一下:***
IntegerCache.low值
IntegerCache.high值
IntegerCache.cache[]数组
这些值在什么时候定义的.
首先,我们要知道IntegerCache是个什么东西:
其他的包装类型类似.但是浮点类型例外.其他可以自行测试