6

出力が変化した理由を誰か教えてください。

public class Demo {
  public void demo()
  {
        Integer y = 567;
        Integer x = y;
        System.out.println(x + " " + y);
        System.out.println(y == x);
        y++;
        System.out.println(x + " " + y);
        System.out.println(y == x);
        y--;
        System.out.println(x + " " + y);
        System.out.println(y == x);
  }
  public static void main(String args[])
  {
        Demo obj = new Demo();
        obj.demo();
  }
}

出力:

567 567

true

567 568

false

567 567

False

ここで、なぜ私は最終的なfalseを取得しているのか.

4

8 に答える 8

3

あなたの

    Integer y = 567;
    Integer x = y;

    int y = 567;
    int x = y;

そして驚くべき行動はなくなります。私の推測では、Java の暗黙的なプリミティブ値のラッパー オブジェクトへの自動ボックス化に出くわし、数値を直接操作していると信じるようになったのではないでしょうか。

于 2013-07-08T12:44:31.590 に答える
2

これは、コンパイラが内部的にこれを行うためです。

y--

意味:

int _y = y.intValue();
_y--;
y = Integer.valueOf(_y);

したがって、y新しいIntegerインスタンスがあります。==値の等価性チェックではなく、オブジェクト参照チェック (を使用する場合) を行っています。

equals()メソッドを使用して 2 つの値を評価します。

于 2013-07-08T12:46:42.903 に答える
0

intの代わりにプリミティブを使用する場合Integer。最終的な出力は になりますtrue

ただし、Integerクラスを使用する場合、これらはObjects. メソッドを使用するとequals、最終的な出力は になりますtrue

于 2013-07-08T12:45:07.567 に答える
-1

作成しても、

Integer a = new Integer(1000);
Integer b = new Integer(1000);

a==b - 偽

しかし、

Integer a = new Integer(1);
Integer b = new Integer(1);

a==b - 真です

Java には、-127 から 128 までの小さい整数のキャッシュがあります。他のすべての整数は、新しく作成されたオブジェクトであり、それらを等しくすることはできません。

于 2013-07-08T12:47:28.337 に答える