これらのコード行が異なる値を返す理由がわかりません。
System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));
出力は次のようになります。
true
false
true
最初のものは を返しtrue
、2 番目のものは を返すのはなぜですか?とfalse
の間には、私が知らない何か違いがあるのでしょうか? (もちろん、< であることは知っています。)127
128
127
128
また、3番目はなぜ戻ってくるのでしょうかtrue
?
答えを読みましたこの質問のtrue
しかし、どのように を返すのか、またなぜ 2 行目のコードが を返すのかがまだわかりませんfalse
。
ベストアンサー1
ここに顕著な違いがあります。
valueOf
Integer
は、-128 から 127 の間で値がキャッシュされている可能性のあるオブジェクトを返します。最初の値はtrue
キャッシュされているので返されますが、2 番目の値はキャッシュされていない値である 128 を返すので、2 つの別々のインスタンスfalse
が取得されます。Integer
注目すべきは参照を比較しているがInteger#valueOf
、キャッシュがサポートしている値よりも大きい値を比較している場合は、ないtrue
解析された値が等しい場合でも(例:Integer.valueOf(128) == Integer.valueOf(128)
)、と評価されます。しなければならない代わりに使用してくださいequals()
。
parseInt
はプリミティブ を返しますint
。これが、3 番目の値がtrue
-を返す理由です128 == 128
。が評価され、当然、 になりますtrue
。
さて、3 番目の結果が生まれるのには、かなりの時間がかかりますtrue
。
開封変換が発生する
int
使用している同値演算子とデータ型、つまりとに関しては、当然ながら、右側にがInteger
表示されます。Integer
valueOf
変換後、2 つのプリミティブ
int
値を比較します。比較はプリミティブに関して期待されるとおりに行われるため、最終的には128
と を比較することになります128
。