3

結果についての説明がない Java の本から次のコードを取得しました。私はそれを実行し、インラインで以下に示す結果を得ましたが、結果を理解するのに助けが必要です:

1. Integer i = -10;
2. Integer j = -10;
3. System.out.print(i==j);  //  ==> true
4. System.out.print(i.equals(j));   //  ==> true
5. Integer n = 128;
6. Integer m = 128;
7. System.out.print(n==m);  //  ==> false
8. System.out.print(n.equals(m));   //  ==> true

私の質問は次のとおりです。

  • 行番号 3 が true に解決されるのはなぜですか? それらは2つの別々のオブジェクトではありませんか?
  • 行番号 3 が真の場合、行番号 7 が真でないのはなぜですか?

よろしくお願いします。

4

4 に答える 4

9

Integer.valueOf(int i)ソースコードを参照してください。

-128 から 127 までの整数をキャッシュ (整数プールを使用) します (これらはデフォルト値で、 でカスタマイズできますjava.lang.Integer.IntegerCache.high) 。

于 2012-12-02T19:08:07.387 に答える
2

==整数を使用することから生じる不条理のレベルを強調するには、次の行を検討してください。

Integer a = 200, b = 200;
System.out.println(a < b || a == b || a > b);

どうやら、これはtrueトートロジーのように見えるため、値に関係なく出力されるはずです。falseもちろん、それは印刷されます。以下は、明らかに同種のトートロジーであり、期待true値を出力します。

System.out.println(a <= b || a > b);
于 2012-12-02T19:19:21.467 に答える
0

Integerはオブジェクトintですが、「スカラー」です。のようなものがInteger i = 270;、カバーの下で になりInteger i = Integer.valueOf(270);ます。したがって、2 つのIntegerオブジェクトを作成すると、それらは区別されます ( で示すように==)。

ただし、JDK では、小さな値 (-128 から 127) を持つオブジェクトvalueOfの作成がキャッシュされ、それらの以前のバージョンが使用可能な場合は再利用されます。Integerしたがって、2 つの明らかに異なる small のインスタンスはIntegers、別々にインスタンス化されたように見えますが、実際には同じである可能性があります。

値を使用して同じことを試みた場合int==比較は常に true になり、equals()呼び出しはコンパイル エラーを生成します (intオブジェクトではないため)。

于 2012-12-02T19:25:54.947 に答える
0

質問1について

docによると、Integer クラスはプリミティブ値にラップされます。これは単に、必要に応じてオブジェクトがプリミティブとして動作し (ステップ 3 で実行される比較)、必要に応じてオブジェクトとして同等に動作することを期待できることを意味します (ステップ4; Integerクラスの代わりにintクラスが使用された場合、この手順は実行できません)。 ステップ 1 と 2 の型をInteger ではなくStringに交換し、再度テストを実行すると、期待どおりの結果が得られます。

質問2について

上記ですでに回答されています。特定の範囲 (-128 および 127) の整数がキャッシュされます。

お役に立てれば。

于 2012-12-02T19:27:35.367 に答える