【问题标题】:Incrementing and Decrementing changing object value递增和递减改变的对象值
【发布时间】:2013-07-05 19:10:30
【问题描述】:

谁能告诉我输出变化的原因。

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

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

【问题讨论】:

  • 试试 y.equals(x) 而不是 ==。

标签: java object increment


【解决方案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  

【讨论】:

  • 错了,== 总是 进行对象引用检查。对第二个false的解释不正确。
  • @BuhakeSindi 我是认真的。但是你弄错了。现在我改变一些单词
【解决方案2】:

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

但是,当您使用 Integer 类时,这些是 Objects。如果您使用equals 方法,最终输出将是true

【讨论】:

  • When you use Integer instead of the primitive int. The final output would be true.。什么?
【解决方案3】:

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

使用

y.equals(x);

(int) y == (int) x

或将xy 声明为int

请注意,Integer == IntegerInteger != Integer 不会自动拆箱。

【讨论】:

    【解决方案4】:

    即使,如果你创造

    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。所有其他整数都是新创建的对象,它们不能相等。

    【讨论】:

    • 在 Java 中 new 运算符 总是 为新对象分配内存。这与 public static Integer valueOf(int i) 方法相反,该方法从内部缓存中获取答案中指定范围的整数,否则返回一个新整数。
    【解决方案5】:

    这是因为编译器在内部这样做:

    y--
    

    意思是:

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

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

    使用equals() 方法计算2个值。

    【讨论】:

      【解决方案6】:

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

      基本上你的代码是

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

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

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

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

      【讨论】:

      • 编译器将使用Integer.valueOf()而不是构造函数。
      • @BuhakeSindi 我使用构造函数来使其更清晰,而不是显示JVM在做什么。
      【解决方案7】:

      改变你的

          Integer y = 567;
          Integer x = y;
      

          int y = 567;
          int x = y;
      

      并且令人惊讶的行为将消失。我的猜测是您偶然发现了 Java 将原始值隐式自动装箱到包装器对象中,并导致您相信您是在直接操纵数字。

      【讨论】:

        【解决方案8】:

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

        y--;
        

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          • 2018-01-30
          • 1970-01-01
          • 2017-02-24
          • 2012-04-29
          • 1970-01-01
          相关资源
          最近更新 更多