字符串是否可以覆盖?

时间:2014-02-07 09:04:58

标签: java string immutability overwrite

我的教科书说String 不可写或不可变,即,一旦输入String的值,就无法更改它。但是今天当我运行以下代码时,String str 被静音,因为编译器没有给出任何错误,并且新String a的值已成功输入{{ 1}}。

str

输出是:任何

那么,我的书是错的吗?

如果我的书没有错,请举例说明class Test { static void main() { String str = "something"; String a ="anything"; str = a; //str is being over written without any error System.out.println(str); } } 是不可变的

8 个答案:

答案 0 :(得分:2)

这本书是对的。当你说str = a时,你没有改变String'某事'。您应该区分strsomething,它们不一样。 "something"这里是内存中的String对象,而str只是对该字符串的引用。与参考a相同。

当你说:

str = a

您没有更改something,实际上是在说,“将引用str更改为指向引用a所指向的内容。” String保持不变,引用发生变化。

在类似的说明中,这就是为什么你可能会在你的书中看到连接String的代价很高,比如:

str = str + a

同样不会更改现有的String,而是创建一个新的String对象,该对象等于引用String所在的str的串联引用引用String所指的a

答案 1 :(得分:1)

您需要了解不可变的含义。在您的方案中,您只是在更改引用。

str = a;

会使astr都指向字符串"anything"。教科书是正确的。 String是不可变的,不能被覆盖。如果您检查JavaDoc String。大多数方法返回String。这是因为String中的任何操作都不会更改String个对象,但会导致创建新的String。实际上,创建它之后永远不能更改String。通过更改我的意思是追加新字符,删除字符而不创建新的String对象。

答案 2 :(得分:1)

许多答案已经指出,你只是改变了参考文献。不可变意味着你无法改变字符串本身。例如,你这样做:

String a = "anything";
System.out.println(a); // -> anything

a.substring(3);
System.out.println(a); // -> anything : this is because the String itself is 
                      //               immutable.

a = a.substring(3);
System.out.println(a); // -> thing : this is what immutable means to edit a string 
                      //            you must reassign it or assign it 
                      //            to a new variable

答案 3 :(得分:0)

您正在将str的引用更改为a。因此str实际上变为a的价值。

答案 4 :(得分:0)

它们只是指向该字符串的指针。因此,当您执行str =a时,只需将a的指针指定给str

答案 5 :(得分:0)

未更改String对象的内容。发生的事情是为变量分配了一个新的String对象。旧的String对象仍然存在于内存中,但您无法再引用它。 'str'变量现在引用包含“anything”的String对象,但包含“something”的String仍然像以前一样存在。尝试首先将'str'分配给另一个变量,然后在将'a'分配给'str'之后,检查另一个变量,你会看到它仍然说“某事”,证明该字符串没有被覆盖。

答案 6 :(得分:0)

在Java中,变量的值绝不是对象,而是引用。与您的案例相关,String变量上的a类型表示该变量只允许包含对String个对象的引用。

您可以更新变量中的值;但这不会触及它所指的对象。

答案 7 :(得分:0)

字符串是不变的;它们的值在创建后无法更改。

创建String对象并将其存储在常量池或文字池中。

在你的情况下,当你说,

String str="something"; // An object is created on constant pool with value 'something' and reference 'str' is pointing to it.

String a="anything"; // An object is created on constant pool with value 'anything' and reference 'a' is pointing to it.

当你这样做时,str = a;然后'str'实际上开始指向'a',但是值为'something'的对象仍保留在具有相同值的常量池中。