概述
如果你运行如下代码:
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
}
}
你会得到以下运行结果:
true
false
我们知道,如果两个引用指向同一个对象,那么就成立;反之,如果两个引用指向的不是同一个对象,那么就不成立,即便两个引用的内容是一样的。因此,结果就会出现false。
这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。
这个东西为那些数值比较小的整数提供内部缓存,当进行如此声明时:
Integer c = 100;
它的内部就是这样的:
Integer i = Integer.valueOf(100);
如果我们观察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 c = 100, d = 100;
两者指向同样的对象。
这就是为什么这段代码的结果为true了:
System.out.println(c == d);
现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?
这是因为在这个范围内的小数值整数在日常生活中的使用频率要比其它的大得多,多次使用相同的底层对象这一特性可以通过该设置进行有效的内存优化。你可以使用reflection API任意使用这个功能。
运行下面的这段代码,你就会明白它的神奇所在了。
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Class cache = Integer.class.getDeclaredClasses()[0]; // 1
Field myCache = cache.getDeclaredField("cache"); // 2 myCache.setAccessible(true);//3
Integer[] newCache = (Integer[]) myCache.get(cache); // 4
newCache[132] = newCache[133]; // 5
int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b);
}
————————————————
版权声明:本文为CSDN博主「其古寺」的原创文章
原文链接
最后
以上就是纯真香氛为你收集整理的int 和 Integer 100和1000的区别?的全部内容,希望文章能够帮你解决int 和 Integer 100和1000的区别?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复