1. ホーム
  2. java

[解決済み] Integer.valueOf(String)による==比較で、127と128で結果が異なるのはなぜですか?

2022-04-16 02:06:51

質問

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

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

また、3つ目はなぜ true ?

回答はこちら この質問について を返すことができるのか、まだ理解していません。 true そして、なぜ2行目のコードでは false .

解決方法は?

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

valueOfInteger オブジェクトがあり、その値は -128 から 127 の間にキャッシュされている可能性があります。 このため、最初の値では true - を返し、2番目の値は false - 128 はキャッシュされた値ではないので、2 つの別々の Integer のインスタンスを作成します。

重要なのは とのリファレンスを比較することになります。 Integer#valueOf で、キャッシュがサポートする値よりも大きな値を比較する場合、キャッシュは ない と評価されます。 true は、たとえ解析された値が同等であっても(例. Integer.valueOf(128) == Integer.valueOf(128) ). あなたは が必要です。 使用 equals() の代わりに

parseInt は、プリミティブな int . このため、3番目の値では true - 128 == 128 が評価され、当然ながら true .

さて、この3つ目の結果を作るために、かなりのことが起こります。 true :

  • アンボックスの変換が発生する は、使用している同値演算子と、持っているデータ型に関して、すなわち intInteger . を取得していますね。 Integer から valueOf もちろん、右手側で。

  • 変換後、あなたは2つのプリミティブな int の値です。 比較はプリミティブに関して期待されるのと同じように行われるので、結局は 128128 .