为什么1000==1000返回false,100==100返回true?

为什么1000==1000返回false,100==100返回true?

这可能是个讨论得较多的话题,但是我觉得它很有趣:为什么1000==1000返回false,100==100返回true?

public static void main(String[] args) {
Integer a = 1000, b = 1000;
   System.out.println(a == b);
   Integer c = 100, d = 100;
   System.out.println(c == d);
}

这段代码运行之后打印出的结果一定会让你赶到困惑,请看:

false
true

我们知道,如果两个引用指向同一个对象,那么它们在==.如果两个引用指向不同的对象,那么即使它们具有相同的内容,它们在==方面也不相等。


这实际上是有趣的地方。如果查看Integer.java类,您会发现有一个内部私有类,IntegerCache.java,它缓存-128和127之间的所有Integer对象。


所以问题是,所有的小整数在内部缓存,当我们声明类似以下内容的时候

Integer a = 1000;

它在内部做什么

Integer i = Integer.valueOf(100);

我们来看看Integer.valueOf()这个方法

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <=
IntegerCache.high)
return IntegerCache.cache[i +
(-IntegerCache.low)];
   return new Integer(i);
}

如果整数的值介于-128和127之间,那么将返回缓存中的对象,所以

Integer a = 1000, b = 1000;

是同一个对象。


那么问题来了,为什么这里要使用缓存?

通常情况下,小整数比大整数使用得更频繁,因此使用相同的底层对象来减少潜在的内存占用是值得的。


就是说100是亲生的,而1000是垃圾桶里捡来的。


后台回复加群可加入编程序学习交流群

后台回复视频可加免费领取各种视频

后台回复书籍真多可加免费领取各种编程电子书


为什么1000==1000返回false,100==100返回true?

为什么1000==1000返回false,100==100返回true?




为什么1000==1000返回false,100==100返回true?

为什么1000==1000返回false,100==100返回true?

如有侵权,请联系删除

转载请注明来源