[Java]JDKソース学習(2)Integer

1478 ワード

まずコードを見てみましょう
Integer a1 = Integer.valueOf(10);
Integer a2 = Integer.valueOf(10);
System.out.println(a1==a2);

Integer i1 = new Integer(10);
Integer i2 = new Integer(10); 
System.out.println(i1==i2);
System.out.println(a1==i1);

Integer k1 = 10 ,k2 = 10;
System.out.println(k1==k2);
System.out.println(a1==k1);
System.out.println(i1==k1);
		
Integer j1 =177 ,j2 =177;
System.out.println(j1==j2);

このコードはIntegerの静態化方法valueOfを比較しjava 1を利用する.5増加したautoboxingがintをIntegerとIntegerの構造方法に与える違い
コードの実行結果は次のとおりです.
true
false
false
true
true
false
false
なぜこの結果になったのかを分析してみましょう
1.まずIntegerの静的化方法valueOfを見てみましょう.IntegerクラスにはIntegerCache静的クラスが定義されています.IntegerCacheにはcache静的配列があり、値が-128-127の範囲のIntegerをキャッシュします.valueOfメソッドを呼び出すとき、パラメータが-128-127の範囲内であれば、cacheから対応するIntegerを取得します.そうでなければコンストラクション関数を呼び出してIntegerを新規作成するので、a 1とa 2は同じ値を取得し、最初の比較結果がtrueであることは理解に難くない.
2.次にi 1,i 2はいずれもIntegerのコンストラクション関数を用いて得られ,2つの異なるinstanceが返されるので,2,3番目の結果はfalseである.
3.次の段落は最も論争があって、私も多くの人が書いたbolgを見て、autoboxingを採用して問題はありませんが、彼らはすべてInteger k 1=10がInteger k 1=new Integer(10)にコンパイルされていると思っています.もしそうなら、4、5、6番目の結果はfalseであるはずですが、実際にはtrue、true、falseです.これはこの文がInteger k 1=Integerにコンパイルされるべきであることを示している.valueOf(10)は、この議論を参考にすることができます.http://stackoverflow.com/questions/766468/autoboxing-so-i-can-write-integer-i-0-instead-of-integer-i-new-integer0
4.1と3の分析により、autoboxingとvalueOfが使用されていることがわかりますが、177が127より大きいので、結果は2と同じです.