为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回fa

来源:互联网 发布:手机淘宝体检中心截图 编辑:程序博客网 时间:2024/05/18 20:34


为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回false 
Integer i =100实际在内部做了
Integer i = Integer.valueOf(100)的操作。
来看Integer.class源码

这个方法的首先断言了IntegerCache.high的值大于等于127(关于这里assert 大于等于127解释请看补充),否则退出方法。
接着if条件内i需要在low值和high值之间。

可以看到low为-128,即if条件需要i在-128和127之间,那么返回i+128作为整型数组 cache的下标,用来放在缓存中。这样也就是说任意一个Integer的数,如果在-128和127之间,那么它们之间的内存地址是相同的。
这也就解释了为什么Integer a=100,b=100时候a==b返回true。
而如果if条件不满足则返回new Integer(i)。

此时不放入缓存,也就是说不在-128和127范围内的数它们的内存地址是不相同的,这也就解释了为什么Integer c=1000,d=1000时候c==d返回false。


补充:
补充说明assert断言IntegerCache.high的值大于等于127才执行该方法。
看源码


可以看到high本身没有值,是h=127赋给它的,而h的值在这之前可能会改变。也就是说缓存上限的127其实是可以改变,可以从VM这个java.lang.Integer.IntegerCache.high中读取为上限,但是需要满足这个上限的值确实在-128和127之间。也就是说缓存的容量其实是可以改变的。基于这个特点,如果缓存的容量在-128到127之间,那么我们为了使用内存数据的高效性,可以将范围内大小的Integer放在同一缓存数组中,而不在范围内的则不放在缓存数组中,这也就是为什么下面的ValueOf方法中需要断言assert high值>=127的原因。