Integer.valueOf(String) を使用した == 比較で、127 と 128 で異なる結果になるのはなぜですか? 質問する

Integer.valueOf(String) を使用した == 比較で、127 と 128 で異なる結果になるのはなぜですか? 質問する

これらのコード行が異なる値を返す理由がわかりません。

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の間には、私が知らない何か違いがあるのでしょうか? (もちろん、< であることは知っています。)127128127128

また、3番目はなぜ戻ってくるのでしょうかtrue?

答えを読みましたこの質問のtrueしかし、どのように を返すのか、またなぜ 2 行目のコードが を返すのかがまだわかりませんfalse

ベストアンサー1

ここに顕著な違いがあります。

valueOfIntegerは、-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表示されます。IntegervalueOf

  • 変換後、2 つのプリミティブint値を比較します。比較はプリミティブに関して期待されるとおりに行われるため、最終的には128と を比較することになります128

おすすめ記事