なぜInteger 100==Integer 100で1000!=1000?

1044 ワード

次のコードを実行すると
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);