相信大家都会有遇到过这样的面试或者笔试题 如下:
知道上面几种情况的输出结果是什么吗?
对于不清楚的情况,或者对该结果又疑问,可以自己通过代码进行测试,当然这也是我今天需要讲到的内容
或许大家心里有疑问,同样的赋值,为什么比较得出的结果却不一样,这里得从Integer的源码讲起。
学过java的同学都知道,使用==和equals比较的不同,前者比较的是引用,而后者比较的是值(内容)。这里同时涉及到自动装箱的问题。自动装箱、拆箱这里就不在详讲,不懂的可以自行百度。
在进行自动装箱的过程中,根据源码可以知道该步骤是调用了valueOf方法,源码如下:
然后我们在看下IntegerCache
从上面的两幅截图可以看出:首先说下下面这幅,意思就是说Integer会自带一个数据缓存,缓存的数据的范围的[-128,127],在初始化的时候,这些数据就已经放入到缓存中了
然后我们再来解释下第一幅图片,就是说如果传入的数据在缓存的范围内,那么就直接从缓存中去拿,如果传入的数据不在缓存范围内,就需要重新实例化一个Integer对象,这也就解释了为什么同样的定义,比较的结果却是不同。