intとInteger 100と1000の違いは?

2674 ワード

次のコードを実行します.
Integer a = 1000, b = 1000; 
System.out.println(a == b);//1 
Integer c = 100, d = 100; 
System.out.println(c == d);//2

次の実行結果が得られます.false trueは、2つの参照が同じオブジェクトを指す場合、==が成立することを知っています.逆に、2つの参照が同じオブジェクトを指していない場合、2つの参照の内容が同じであっても==は成立しません.そのため、結果falseが表示されます.ここはとても面白いところです.Integerを見たらJAvaクラスはIntegerCacheを見つけますJAvaという内部プライベートクラスは、-128から127の間のすべての整数オブジェクトにキャッシュを提供します.これは数値の小さい整数に内部キャッシュを提供し、このような宣言を行うと:Integer c=100;その内部はこうです.Integer i=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の場合、キャッシュのインスタンスが返されます.だから... Integer c = 100, d = 100; 両者は同じオブジェクトを指します.これがこのコードの結果がtrueになった理由です:System.out.println(c == d); なぜ-128から127の間のすべての整数にキャッシュを設定したのかと聞かれるかもしれません.これは、この範囲内の小さな数値整数の日常生活での使用頻度が他のものよりずっと大きいため、同じ下位オブジェクトを複数回使用するという特性がこの設定によって有効なメモリ最適化が可能になるからです.この機能はreflection APIを使用して任意に使用できます.次のコードを実行すると、その不思議さがわかります.  
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { 
Class cache = Integer.class.getDeclaredClasses()[0]; //1 
Field myCache = cache.getDeclaredField("cache"); //2 myCache.setAccessible(true);//3 
Integer[] newCache = (Integer[]) 
myCache.get(cache); //4 
newCache[132] = newCache[133]; //5 
int a = 2; int b = a + a; 
System.out.printf("%d + %d = %d", a, a, b); // }