まず、int と Integer の違いについて話しましょう:
int は基本的なデータ型で、Integer は int のラッパー クラスです。注: 後者のタイプは「クラス」です。たとえば、ジェネリックを使用すると、List
int の初期値は 0 になり、integer は null になります。
以下の具体的な例を見てください:
package syswar.cc; public class IntegerCompare { public static void main(String[] args) { // TODO Auto-generated method stub Integer a1 = 2; Integer a2 = 2; Integer b1 = 150; Integer b2 = 150; Integer c1 = new Integer(2); Integer c2 = new Integer(2); Integer d1 = new Integer(150); Integer d2 = new Integer(150); System.out.println("a1==a2?" + (a1==a2)); System.out.println("b1==b2?" + (b1==b2)); System.out.println("c1==c2?" + (c1==c2)); System.out.println("d1==d2?" + (d1==d2)); } }
実行結果:
a1==a2?true b1==b2?false c1==c2?false d1==d2?false>
この結果はなぜですか?まず、2 つのグループ a と b を比較してみましょう。 Integer が初期化されると、これらの Integer オブジェクトに対応する int 値は [-128,127] のバイト範囲内にキャッシュされます。
int 値を Integer に直接割り当てる場合、値の範囲が [-128,127] の場合、Integer はキャッシュから Integer オブジェクトを直接取得します。したがって、直接割り当てられた int 値が [-128,127] にある場合、Integer オブジェクトは次のようになります。同じオブジェクトです。
newメソッドで取得したIntegerオブジェクトはヒープから直接割り当てられたオブジェクトであるため、具体的なint値が何であっても==判定の結果は偽となります