String s;
/*code*/
s = "foo";
是否创建了一个全新的对象,因为空字符串无法更改?
答案 0 :(得分:6)
此:
String s;
不会创建“空字符串”,它只是一个未初始化的变量。
此:
s = "foo";
将该变量设置为引用String
对象。它是不可变的对象,而不是变量。
答案 1 :(得分:5)
您需要了解变量和对象之间的区别。
考虑以下代码:
String x = "hello";
for (int i = 0; i < 10; i++) {
x = x + i;
}
这将最终创建11个字符串对象,但只涉及两个变量(x
和i
)。在任何时候,i
的值是一个整数(0-10),x
的值是String
的引用1}}。 (它也可能是null
,但它不会出现在这个例子中。)
了解x
不是对象,x
的值也不是一个对象,这一点非常重要。
如果以物理方式考虑它,请考虑一张带有我家庭住址的纸张:
这张纸和地址都不是房子本身。如果你在纸上擦掉地址并写一个不同的地址,那就不会对我的房子做任何改变 - 就像更改x
的值不会对其进行任何更改一样字符串对象本身在我的示例代码中。
答案 2 :(得分:2)
s
目前尚未分配给任何内容。
但如果您有 - 如果您已定义String s = "";
然后s = "foo";
,则空字符串不会更改,但变量s
会更改为引用到字符串"foo"
而不是空字符串。