我的教科书说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);
}
}
是不可变的
答案 0 :(得分:2)
这本书是对的。当你说str = a
时,你没有改变String
'某事'。您应该区分str
和something
,它们不一样。 "something"
这里是内存中的String对象,而str
只是对该字符串的引用。与参考a
相同。
当你说:
str = a
您没有更改something
,实际上是在说,“将引用str
更改为指向引用a
所指向的内容。” String
保持不变,引用发生变化。
在类似的说明中,这就是为什么你可能会在你的书中看到连接String
的代价很高,比如:
str = str + a
同样不会更改现有的String
,而是创建一个新的String
对象,该对象等于引用String
所在的str
的串联引用引用String
所指的a
。
答案 1 :(得分:1)
您需要了解不可变的含义。在您的方案中,您只是在更改引用。
str = a;
会使a
和str
都指向字符串"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'的对象仍保留在具有相同值的常量池中。