程序中经常会用到数字比较,但是你认为1000 == 1000 和 100 == 100比较值是否相同呢?
Integer a = 1000 , b = 1000;
System.out.println(a == b);
Integer c = 100 , d = 100;
System.out.println(c == d);
比较结果:
false
true
造成原因:
Integer会将-127~128加入到缓存数组中,所以两次声明得100是指向同一对象得。
我们可以通过反射,获取到该数组中维护得数字:
Class cache = Integer.class.getDeclaredClasses()[0];
Field myCache = cache.getDeclaredField("cache");
myCache.setAccessible(true);
Integer[] newCache = (Integer[]) myCache.get(cache);
System.out.println(newCache.length);
for (Integer integer : newCache) {
System.out.print(integer+",");
}
结果:
256
-128,-127,-126,-125,-124,-123,-122,-121,-120,-119,-118,-117,-116,-115,-114,-113,-112,-111,-110,-109,-108,-107,-106,-105,-104,-103,-102,-101,-100,-99,-98,-97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-84,-83,-82,-81,-80,-79,-78,-77,-76,-75,-74,-73,-72,-71,-70,-69,-68,-67,-66,-65,-64,-63,-62,-61,-60,-59,-58,-57,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46,-45,-44,-43,-42,-41,-40,-39,-38,-37,-36,-35,-34,-33,-32,-31,-30,-29,-28,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,
这里还有一个有趣的,我们可以让数字相加出错误结果:
Class cache = Integer.class.getDeclaredClasses()[0];
Field myCache = cache.getDeclaredField("cache");
myCache.setAccessible(true);
Integer[] newCache = (Integer[]) myCache.get(cache);
System.out.println(newCache.length);
newCache[132] = newCache[133];
System.out.println(newCache[132]);
int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b);
结果:
256
5
2 + 2 = 5
原因:
2+2 = 4 结果应该在缓存的第132位,但是我们将133位的5换给了他,所以结果就变为5