我无法理解为什么String不能像对象那样工作,以致于当您更改它时,分配给它的变量也会改变。
我尝试制作一个字符串数组,然后将一个元素的引用分配给一个变量(之所以说引用,是因为从我的理解中,Java是按值传递,而内存引用是“值”),
当我更改字符串时元素,该变量不反映更改。
String[] arr={"abc","def"};
String s=arr[1];
arr[1]+="123r";
for (String i:arr) {System.out.print(i);}
System.out.println(); // prints "abcdef123r"
System.out.println(s); //prints "def"
Run Code Online (Sandbox Code Playgroud)
也许,从我一直在阅读的内容来看,赋值运算符不能像Strings那样工作。
字符串是不可变的。这意味着它们的价值永远不变。他们的引用可以重新分配,这就是在这里发生的情况。
评论中的时间表:
// Create two Strings. [string1]="abc", [string2]="def"
// Assign [string1] to arr[0].
// Assign [string2] to arr[1].
String[] arr={"abc","def"};
// Get value from arr[1] = [string2]
// Assign [string2] to s
String s=arr[1];
// Get value from arr[1] = [string2]
// create [string3] = "123r"
// create [string4] = [string2] + [string3]
// assign [string4] to arr[1]
arr[1]+="123r";
// get value from arr[0] = [string1]
// print [string1] = "abc"
// get value from arr[1] = [string4]
// print [string4] = "def123r"
for (String i:arr) {System.out.print(i);}
System.out.println(); // prints "abcdef123r"
// get value from s = [string2]
// print value "def"
System.out.println(s); //prints "def"
Run Code Online (Sandbox Code Playgroud)
我说引用是因为从我的理解中,Java是按值传递的,而内存引用就是“值”
几乎正确。
引用是一个地址。可以在内存中找到该值。
因此,您所拥有的是:
变量=可读。苹果。
参考=内存地址。计算机可读。
值=内存中给定地址的一些字节。
所以当你这样做
String s = arr[1];
Run Code Online (Sandbox Code Playgroud)
您正在将链接到变量的内存地址分配给arr[1]变量s。RAM中的值保持不变,并且不会更改。
当你做
arr[1] += "123r";
Run Code Online (Sandbox Code Playgroud)
您正在创建一个全新的String。
扩展这就是一步一步发生的事情。
arr[1] += "123r";
arr[1] = arr[1] + "123r";
arr[1] = "def" + "123r";
arr[1] = "def123r";
Run Code Online (Sandbox Code Playgroud)
因此arr[1],在= =之后,将获得操作结果的内存地址/引用,
但是此操作与变量完全没有关系s,因为此变量保存原始String的地址,并且没有代码可更新该引用/内存地址。