++运算符对Integer做了什么?

Eri*_*ang 7 java wrapper variable-assignment

以下测试用例将通过:

@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,
}
Run Code Online (Sandbox Code Playgroud)

所以:

  • a改变了++.
  • b 保持原样.

问题是:

  • b = a 只需指定正确的引用值,它们引用同一个对象,此时只有一个对象,对吧?
  • 什么++运算符在整数上做什么?
    由于Integer是不可变的,这是否意味着++创建了一个新的Integer对象,并自动将其分配回原始变量?如果是这种情况,这是否意味着a现在指向另一个对象?
  • 现在有2个对象?并且b仍然指向原来的一个?

And*_*ner 10

a++;
Run Code Online (Sandbox Code Playgroud)

因为aInteger,这与以下相同:

a = Integer.valueOf(a.intValue() + 1);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 要添加到这个答案,如果`a`在该缓存范围内(例如`123`),并且你做`a ++`*和*`b ++`它们将指向同一个对象. (3认同)
  • @EricWang正确.它对于`int`来说也不是原子的. (2认同)