この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");
false
128は静的キャッシュにないため、これはを返します。したがってInteger
、平等の両側に新しいものが作成されます。2つの異なるInteger
オブジェクトがあり==
、オブジェクトがtrue
両方の側がまったく同じオブジェクトである場合にのみ返されるため、これはになりますfalse
。
Integer.parseInt("128")==Integer.valueOf("128");
これはint
、左側のプリミティブ値128をInteger
右側の新しく作成されたオブジェクトと比較しています。しかし、それは比較することは意味がありませんのでint
にInteger
、Javaの意志の自動UnboxのInteger
比較を行う前に、つまり、とint
を比較することになりint
ます。プリミティブ128はそれ自体と等しいため、これはを返しますtrue
。
.equals()
します。それ以外の場合はすべての賭けがオフになります。