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

这就是为什么我得到最后的错误。

4

8 回答 8

5

您正在使用Integerwhich 是不可变的对象。

基本上你的代码是

y = new Integer(y.intValue() + 1);

y = new Integer(y.intValue() - 1);

因此,您正在创建两个与之前的对象Integer不同 ( ==) 的新对象。

这种行为在 Java中称为自动装箱。

于 2013-07-08T12:45:27.743 回答
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 回答
1
    Integer y = 567; // y=567
    Integer x = y;   // x is equal to y object
    System.out.println(x + " " + y); // out put x and y so obviously x and y are 567
    System.out.println(y == x); // here x and y are in same reference. so this x==y is true and out put is true. 
    y++; // increment y by 1. then y=568
    System.out.println(x + " " + y); // now x= 567 and y= 568
    System.out.println(y == x);// now x not equals to y then false will print
    y--; // again decrement y value
    System.out.println(x + " " + y); // again x and y are same 567
    System.out.println(y == x);// here y.value == x.value but x and y object wise not equal since object x and y are referring deference points  
于 2013-07-08T12:50:32.793 回答
0

因为 x 和 y 指的是 2 个不同的对象。

y--;

这首先将 y 拆箱为 int,然后将其递减,然后将其装箱为 Integer。而这个新的装箱整数指的是不同的内存位置。

理想情况下,在包装类上,最好在包装对象上调用 equals 方法而不是 == 运算符。

于 2013-07-08T12:43:10.930 回答
0

y == x检查内容相等性,即它们是否指向同一个对象,而不是它们指向的对象是否包含相同的int. 特别是当x, y >= 128.

利用

y.equals(x);

或者

(int) y == (int) x

或声明xy改为int

请注意,自动拆箱不会发生在Integer == Integer或中Integer != Integer

于 2013-07-08T12:43:36.750 回答
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 回答