代码之家  ›  专栏  ›  技术社区  ›  Eric

++运算符对整数做了什么?[复制品]

  •  7
  • Eric  · 技术社区  · 5 年前

    这个问题已经有了答案:

    以下测试用例将通过:

    @Test
    public void assignWrapperTest() {
        System.out.printf("\nassign - %s\n", "wrapper");
    
        Integer a = 1000;
        Integer b = a;
        System.out.printf("a = %d, b = %d\n", a, b);
        Assert.assertEquals(a, b);
        Assert.assertSame(a, b); // a, b are the same object,
    
        a++;
        System.out.printf("a = %d, b = %d\n", a, b);
        Assert.assertNotEquals(a, b);
        Assert.assertNotSame(a, b); // a, b are not the same object, any more,
    }
    

    所以:

    • a 被改变 ++ .
    • b 保持不变。

    问题是:

    • b = a 只需赋予参考值权利,它们引用同一个对象,此时只有一个对象,对吗?
    • ++运算符对整数做什么?
      因为整数是不可变的,这是否意味着 ++ 创建了一个新的整数对象,并自动将其分配回原始变量?如果是这样的话,那是不是意味着 现在指向另一个对象?
    • 现在有两个物体?和 还是指向原来的那个?
    5 回复  |  直到 5 年前
        1
  •  10
  •   Andy Turner    5 年前
    a++;
    

    因为 a 是一个 Integer ,这与:

    a = Integer.valueOf(a.intValue() + 1);
    

    这意味着 ++ 创建了一个新的整数对象

    可能,但不一定: Integer.valueOf 将重用缓存值;只有在缓存范围之外(至少为-128..127)才会创建新值。

        2
  •  4
  •   Amit Bera    5 年前

    如果我们看看 Byte code 属于 a++ ;如下所示:

        9: aload_1
       10: invokevirtual #22                 // Method java/lang/Integer.intValue:()I
       13: iconst_1
       14: iadd
       15: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       18: astore_1
    

    所以说明书就像是 intValue() 属于 a 然后 increment 然后调用 Integer#valueOf 在的递增值和整数值上创建一个新对象。

        3
  •  1
  •   Sridhar    5 年前

    对。

    Integer 对象是不可变的。但是,他们持有的参考是可变的。 整数 类,缓存数据并重用它们。

    让我们看看代码中发生了什么。

    Integer a = 1000; //假设它在具有地址引用的堆中创建一个4字节的内存块 &addr_of_val_1000;

    Integer b = a; //现在,b指向地址引用 &地址:Val_1000;

    a++; //这将创建/获取一个新值 1001 在具有新地址引用的堆中/从堆中 &addr_of_val_1001; 并分配给变量A

    所以,

    A=1001和B=1000不相等。 &地址是“val”1000!=值1001的地址(它们的引用不再相同)

    但是,如果你加上,

    b++;

    b = Integer.valueOf(1001)

    在你支票之前,它们将是一样的。

        4
  •  1
  •   bohemian Ajinkya    5 年前
    • 没错。这就是JVM的工作方式。
    • 对。 a++ 有效地做到了 a=a+1 (忽略将其转换为 Integer )表达式 a+1 计算为新的 int 以及分配给 a .
    • 肯定的。价值 b 之前的操作未触及,因此它仍指向同一对象。
        5
  •  0
  •   ZhaoGang    5 年前

    关键是 Integer immutable .

    1. 如果操作数是可变的,例如 int , ++ 操作员只需添加 1 原值 就位 .

    2. 为了 整数 这是不同的。通过 a++ ,的新实例 整数 它的价值来自于添加 到原始的整数对象, a b 指向,然后 重新分配给这个新对象。 仍然引用原始整数对象,因此 现在不一样了。