首页 > 数据库 > 数据库开发技术 > 包装类的小秘密,200和200竟然不相等?
关注Java架构栈,干货天天都不断哦!
无论是在Java面试时,还是在学习的过程中,我们都没有办法跳过包装类这个非常基础而又常用的部分。而又因为这个部分看起来很简单,所以往往重视程度又不足,我们很多人会注意不到一些细节,进而导致在面试或者工作中频频翻车。
为了让大家更好地认识到Java包装类里的一些细节问题,接下来我们可以通过一个很常见的经典面试题来窥测一二。

按照我们对引用类型的理解,上面的代码中,i1和i2、i5和i6都是使用数字直接赋值的,而i3和i4、i7和i8是通过调用构造方法创建的,所以可能很容易就会得出如下这个结论:

但当我们信心满满的点击运行上述代码的时候,却发现了一个不太一样的结果:

i3==i4的结果是true,但是i7==i8的结果却是false!这是咋回事?这和我们之前理解的引用类型仿佛有差别啊!
100==100,但是200!=200?!!这是为什么呢?别急,接下来我们就来探究一下这内部的真正原因。
我们都知道,在包装类中有四个关于整数类型的包装类,分别是Byte、Short、Integer、Long 四种。下面我们挨个看一下这几个包装类的源码。
首先我们来看一下Byte这个包装类,我们会发现在该类中存在这么一个私有静态内部类:

在这个私有静态内部类中,有一个静态的常量数组,其中保存了数值是-128~127的Byte类型的对象。而我们在使用基本数据类型对包装类型的变量赋值时,默认会调用valueOf方法:

而在valueOf这个方法内部,当数据的范围是-128~127的时候,会返回私有静态内部类中静态数组中已经创建好的变量。
下面我们再来看看Short这个包装类,发现其中也存在一个类似的私有静态内部类:

在这个私有的静态内部类中, 也有一个 -128~ 127的数值的静态的常量数组,保存着该范围内的Short类型对象。下面我们来看下它的valueOf方法源码:

这个方法内部的处理逻辑,就是当数值处于-128~127的范围之中的时候,直接返回私有静态内部类的常量
数组中保存好的数据,一旦数值超出了这个范围,就会创建一个新的对象。
在Long包装类中, 也存在类似的结构:

最后我们来看下本文的重点 --- Integer类中是否也存在类似的结构:

乍一看,这个私有静态内部类仿佛比其他的三个要复杂的多,感觉好像并不一样。但是我们仔细一看, 就会发现这个私有静态内部类的作用,仍然是使用一个静态常量数组,来保存 -128~127 这个数值范围内的Integer类型的对象,而它的valueOf方法也是和别的类中一致:

从源码可以看出,Integer类的valueOf方法,其作用和之前看到的其他三个并没有什么区别。
经过上面的分析,我们会发现,原来四种整数类型的包装类中,都存在一个私有的静态内部类,也就是我们说到的缓存类。
这些静态内部类的作用,就是使用一个静态常量数组,来保存数值位于-128~127之间的包装类对象。当我们使用具体的数值进行赋值时,它就会判断所使用的数值是否处于这个范围中。
如果处于这个范围中,那么无论是多少个不同的变量,保存的都是相同的包装类对象。否则就会创建一个全新的对象,此时无论是多少个不同的变量,保存的都不是同一个包装类对象。
另外我们也知道,==这个运算符,比较的是这个变量中的地址是否相同,因此才会出现100==100,但是200!=200的现象。现在你知道这个面试题的答案为什么这样了吗?如果你还有其他问题,可以在评论区留言哦!关注Java架构栈,干货天天都不断。

原文作者:Java架构栈;如有侵权,请联系管理员删除。