このIntegerクラスには静的キャッシュがあり、Integer-128から127までのすべての値に1つずつ、256の特別なオブジェクトを格納します。このことを念頭に置いて、これら3つのオブジェクトの違いを考慮してください。
new Integer(123);
これは(明らかに)まったく新しいIntegerオブジェクトになります。
Integer.parseInt("123");
これは、のint解析後にプリミティブ値を返しますString。
Integer.valueOf("123");
これは他のものより複雑です。まず、を解析しStringます。次に、値が-128から127の間の場合、静的キャッシュから対応するオブジェクトを返します。値がこの範囲外の場合は、値を呼び出しnew Integer()て渡し、新しいオブジェクトを取得します。
では、質問の3つの表現について考えてみましょう。
Integer.valueOf("127")==Integer.valueOf("127");
Integer値が127の静的キャッシュから2回取得され、それ自体と比較されるため、これはtrueを返します。Integer関係するオブジェクトは1つだけなので、これはを返しますtrue。
Integer.valueOf("128")==Integer.valueOf("128");
false128は静的キャッシュにないため、これはを返します。したがってInteger、平等の両側に新しいものが作成されます。2つの異なるIntegerオブジェクトがあり==、オブジェクトがtrue両方の側がまったく同じオブジェクトである場合にのみ返されるため、これはになりますfalse。
Integer.parseInt("128")==Integer.valueOf("128");
これはint、左側のプリミティブ値128をInteger右側の新しく作成されたオブジェクトと比較しています。しかし、それは比較することは意味がありませんのでintにInteger、Javaの意志の自動UnboxのInteger比較を行う前に、つまり、とintを比較することになりintます。プリミティブ128はそれ自体と等しいため、これはを返しますtrue。
.equals()します。それ以外の場合はすべての賭けがオフになります。