递增和递减更改对象值

时间:2013-07-08 12:40:23

标签: java object increment

任何人都可以告诉我产出变化的原因。

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

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

8 个答案:

答案 0 :(得分:5)

您正在使用Integer这是一个不可变对象。

基本上你的代码是

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

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

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

此行为在Java中称为 autoboxing

答案 1 :(得分:3)

更改您的

    Integer y = 567;
    Integer x = y;

    int y = 567;
    int x = y;

并且令人惊讶的行为将会消失。我的猜测是你偶然发现Java隐含的 autoboxing 原始值到包装器对象中,并且导致你相信你正在直接操纵这些数字。

答案 2 :(得分:2)

这是因为编译器在内部执行此操作:

y--

表示:

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

因此,y有一个新的Integer实例。您正在进行对象引用检查(使用==时)而不是值相等检查。

使用equals()方法评估2个值。

答案 3 :(得分: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  

答案 4 :(得分:0)

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

y--;

首先将y解包为int而不是减去它,然后将其打包为Integer。这个新的盒装整数指的是不同的内存位置。

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

答案 5 :(得分:0)

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

使用

y.equals(x);

(int) y == (int) x

或将xy声明为int

请注意,Integer == IntegerInteger != Integer不会发生自动取消装箱。

答案 6 :(得分:0)

使用原始int而不是Integer时。最终输出为true

但是,当您使用Integer课程时,这些课程为Object。如果您使用equals方法,则最终输出为true

答案 7 :(得分:-1)

甚至,如果你创建

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

a == b - false

但是

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

a == b - 是真的

在java中有一个小整数的缓存:-127到128.所有其他整数都是新创建的对象,它们不能等于。