在Java中,字符串是不可变的,那么在这样做时究竟发生了什么?

时间:2012-03-24 21:40:34

标签: java string

String s;
/*code*/
s = "foo";

是否创建了一个全新的对象,因为空字符串无法更改?

3 个答案:

答案 0 :(得分:6)

此:

String s;

不会创建“空字符串”,它只是一个未初始化的变量。

此:

s = "foo";

将该变量设置为引用String对象。它是不可变的对象,而不是变量。

答案 1 :(得分:5)

您需要了解变量对象之间的区别。

考虑以下代码:

String x = "hello";
for (int i = 0; i < 10; i++) {
    x = x + i;
}

这将最终创建11个字符串对象,但只涉及两个变量xi)。在任何时候,i是一个整数(0-10),xString的引用1}}。 (它也可能是null,但它不会出现在这个例子中。)

了解x不是对象,x也不是一个对象,这一点非常重要。

如果以物理方式考虑它,请考虑一张带有我家庭住址的纸张:

  • 这张纸就像变量一样 - 它可以存储一个值&#34;。
  • 写在纸上的地址就像参考 - 它是找到对象的一种方式
  • 房子就像物体一样。

这张纸和地址都不是房子本身。如果你在纸上擦掉地址并写一个不同的地址,那就不会对我的房子做任何改变 - 就像更改x的值不会对其进行任何更改一样字符串对象本身在我的示例代码中。

答案 2 :(得分:2)

s目前尚未分配给任何内容。

但如果您有 - 如果您已定义String s = "";然后s = "foo";,则空字符串不会更改,但变量s会更改为引用到字符串"foo"而不是空字符串。