本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问: Java的基本类型是不变的吗?
如果我们具有局部变量i
int i = 10;
然后为i分配一个新值:
i = 11;
这会分配一个新的内存位置吗?还是只替换原始值? 这是否意味着基本类型是不可变的?
回答1:
这会分配一个新的内存位置吗?还是只替换原始值?
Java并没有真正保证变量将与内存位置相对应。例如,i如果编译器发现您从来没有真正使用过它的值,或者如果它可以在代码中进行跟踪,则您的方法可能以存储在寄存器中的方式进行了优化,或者甚至根本不存储。直接使用适当的值。
但是,先忽略上面这个问题,如果我们在这里将局部变量抽象化为表示调用堆栈上的存储位置,则i = 11只需修改该存储位置上的值即可。它不需要使用新的存储位置,因为变量i是唯一引用旧位置的东西。
这是否意味着基本数据类型是不可变的?
是否?:是的 但并不是上面的原因。
当我们说某个东西是可变的时,我们的意思是说它可以被修改:在仍然具有相同身份的情况下进行更改。例如,当您长出头发时,您正在修改自己:您仍然是您,但是您的属性之一是不同的。
就基本类型而言,它们的所有属性都完全由它们的具体的数据类型决定,1永远是1,1+1永远是2,你不能改变它。
如果给定int变量具有值1,则可以将其更改为具有值2,但这是引用的全部更改:它不再具有以前的值。就像改变me指向别人而不是指向我一样:它实际上并没有改变我,只是改变了me。
当然,对于对象,您通常可以同时执行以下两项操作:
StringBuilder sb = new StringBuilder("foo");
sb.append("bar"); // mutate the object identified by sb
sb = new StringBuilder(); // change sb to identify a different object
sb = null; // change sb not to identify any object at all