包装类,通过自动装箱后部分对象地址值相同的问题

首先,讨论一下什么是包装类.包装类是一个统称,指的并不是一个类,而是一些类.包装类是针对于基本数据类型而产生的类.所以有几个基本数据类型,就有基本包装类.

其产生的原因就是为了更加方便的去操作基本数据类型.提高对基本数据类型操作的功能性.

基本数据类型 --> 包装类 : 可以具备功能

基本数据 --> 对象 :可以调用方法,增强其操作性.

以Integer类为例:

第一种情况:通过new对象获取:

只要使用new出来的Integer对象,无论值是否一样,那么对象的地址值都是不一样的.

如图:

> ![](media/image1.png){width="5.7652777777777775in" height="3.0236111111111112in"}

第二种情况:通过自动装箱获取

在-128到127之间的数值,通过自动装箱获取的Integer对象,相同的值获取的对象地址值是一样的.

如图:

![](media/image2.png){width="5.761111111111111in" height="3.438888888888889in"}

我们主要来讲解一下第二种情况,为什么通过自动装箱之后在(byte)取值范围之间的相同数值获取的对象是一致的.

首先,我们要知道Integer使用的是哪个方法实现的自动装箱功能.

![](media/image3.png){width="5.766666666666667in" height="3.3131944444444446in"}

如图可以得知通过Integer中的valueOf()方法,是可以能够实现装箱功能,而且相同的10装箱之后的地址值也是相同的.

![](media/image4.png){width="5.7652777777777775in" height="3.7319444444444443in"}

而且如果超出了byte取值范围,相同的值包装成对象之后地址值就不再相同.和我们之间的结论是一致的.那么我们可以理解,Integer自动装箱其实调用的是valueOf()功能实现的.

想要知道具体的原因,那么就必须看valueOf()方法的源码如何实现的;

![](media/image5.png){width="5.757638888888889in" height="2.1638888888888888in"}

在valueOf()源码中,我们可以看到如果在某个范围之间的数值,会在指定的数组中获取Integer对象.那么我们先在***讨论一下:***

IntegerCache.low值

IntegerCache.high值

IntegerCache.cache[]数组

这些值在什么时候定义的.

首先,我们要知道IntegerCache是个什么东西:

![](media/image6.png){width="5.763888888888889in" height="2.548611111111111in"}

其他的包装类型类似.但是浮点类型例外.其他可以自行测试

猜你喜欢

转载自blog.csdn.net/sinat_43606156/article/details/86651059