ITPub博客

首页 > 数据库 > 数据库开发技术 > 包装类的小秘密,200和200竟然不相等?

包装类的小秘密,200和200竟然不相等?

原创 数据库开发技术 作者:Finally_m 时间:2023-03-10 08:00:00 0 删除 编辑

关注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 四种。下面我们挨个看一下这几个包装类的源码。


1.Byte源码分析


首先我们来看一下Byte这个包装类,我们会发现在该类中存在这么一个私有静态内部类:



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



而在valueOf这个方法内部,当数据的范围是-128~127的时候,会返回私有静态内部类中静态数组中已经创建好的变量。


2.Short源码分析


下面我们再来看看Short这个包装类,发现其中也存在一个类似的私有静态内部类:



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



这个方法内部的处理逻辑,就是当数值处于-128~127的范围之中的时候,直接返回私有静态内部类的常量


数组中保存好的数据,一旦数值超出了这个范围,就会创建一个新的对象。


3.Long源码分析


在Long包装类中, 也存在类似的结构:



4.Integer源码分析


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



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



从源码可以看出,Integer类的valueOf方法,其作用和之前看到的其他三个并没有什么区别。


三. 结论


经过上面的分析,我们会发现,原来四种整数类型的包装类中,都存在一个私有的静态内部类,也就是我们说到的缓存类。


这些静态内部类的作用,就是使用一个静态常量数组,来保存数值位于-128~127之间的包装类对象。当我们使用具体的数值进行赋值时,它就会判断所使用的数值是否处于这个范围中。


如果处于这个范围中,那么无论是多少个不同的变量,保存的都是相同的包装类对象。否则就会创建一个全新的对象,此时无论是多少个不同的变量,保存的都不是同一个包装类对象。


另外我们也知道,==这个运算符,比较的是这个变量中的地址是否相同,因此才会出现100==100,但是200!=200的现象。现在你知道这个面试题的答案为什么这样了吗?如果你还有其他问题,可以在评论区留言哦!关注Java架构栈,干货天天都不断。

- 千锋教育 -

近期课程上新:
Java基础 | Javaweb基础 | Java高级框架 | 微服务架构 | TiDB分布式数据库入门最佳实践 | VUE全面剖析及前后端联动实战 | 23种设计模式 | 企业级项目实战 | Java面试宝典

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

请登录后发表评论 登录
全部评论

注册时间:2021-04-13

  • 博文量
    573
  • 访问量
    243794