數字Integer物件比較發生的尷尬事

2021-08-22 08:35:02 字數 2124 閱讀 9794

程式中經常會用到數字比較,但是你認為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)

結果:

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

52 + 2 = 5

原因:

2+2 = 4  結果應該在快取的第132位,但是我們將133位的5換給了他,所以結果就變為5

Integer型別物件比較

先看一段 integer i1 1813 integer i2 1813 system.out.println i1 i2 integer i3 127 integer i4 127 system.out.println i3 i4 列印結果 false true i1 i2 結果是false容易理...

工作隨筆 integer物件比較

問題 對於integer物件,當比較2 2的時候,返回的值是true還是false?當比較2000 2000的時候,返回的值是true還是false?回答 當比較2 2的時候,返回的值是true 當比較2000 2000的時候,返回的值是false。理由 equal比較是兩個值的大小是否能夠相等 比...

Integer物件的比較問題

integer a 1 integer b 1 integer c 500 integer d 500 system.out.println a b system.out.println c d integer aa new integer 10 integer bb new integer 10 ...