为什么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是垃圾桶里捡来的。
后台回复加群可加入编程序学习交流群
后台回复视频可加免费领取各种视频
后台回复书籍真多可加免费领取各种编程电子书
如有侵权,请联系删除
转载请注明来源