整数不可变

2022-08-31 09:26:19

我知道这可能非常愚蠢,但是很多地方声称Java中的Integer类是不可变的,但下面的代码:

Integer a=3;
Integer b=3;
a+=b;
System.out.println(a);

执行时不会遇到任何问题,给出(预期的)结果 6.因此,实际上 a 的值已经发生了变化。这是否意味着整数是可变的?次要问题和一点题外话:“不可变类不需要复制构造函数”。有人想解释为什么吗?


答案 1

不可变并不意味着它永远不能等于另一个值。例如,也是不可变的,但我仍然可以这样做:aString

String str = "hello";
// str equals "hello"
str = str + "world";
// now str equals "helloworld"

str没有被改变,而是现在是一个完全新的实例化对象,就像你一样。因此,的值没有变化,但它被一个全新的对象所取代,即.strIntegeranew Integer(6)


答案 2

a是一些整数(3)的“引用”,你的速记实际上意味着这样做:a+=b

a = new Integer(3 + 3)

所以不,整数不是可变的,但指向它们的变量是*。

*可以有不可变的变量,这些变量由关键字表示,这意味着引用可能不会改变。final

final Integer a = 3;
final Integer b = 3;
a += b; // compile error, the variable `a` is immutable, too.