数字Integer对象比较发生的尴尬事

程序中经常会用到数字比较,但是你认为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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值