なぜInteger 100==Integer 100で1000!=1000?
1044 ワード
次のコードを実行すると
次の結果が得られます
==参照が指すオブジェクトが同じかどうか、メモリアドレスが同じかどうかを比較します.Integerのコードを表示すると、
値が-128~127の場合、キャッシュのインスタンスが返されます.これで以上の問題がわかった.次は面白い例です.
Integer a = 1000, b = 1000;
System.out.println(a == b);
Integer c = 100, d = 100;
System.out.println(c == d);
次の結果が得られます
false
true
==参照が指すオブジェクトが同じかどうか、メモリアドレスが同じかどうかを比較します.Integerのコードを表示すると、
Integer a = 100;
と宣言すると、実際にはInteger a = Integer.valueOf(100))
が実行され、ValueOf関数の表示を続行します.public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
値が-128~127の場合、キャッシュのインスタンスが返されます.これで以上の問題がわかった.次は面白い例です.
Class cache = Integer.class.getDeclaredClasses()[0];
Field myCache = cache.getDeclaredField("cache");
myCache.setAccessible(true);
Integer[] newCache = (Integer[]) myCache.get(cache);
newCache[132] = newCache[133];
int a = 2;
int b = a + a;
System.out.printf("%d + %d = %d", a, a, b);