gpt4 book ai didi

java - 为什么修改字符串数组元素时字符串没有改变

转载 作者:行者123 更新时间:2023-12-02 05:02:15 24 4
gpt4 key购买 nike

我无法理解为什么字符串不能像对象一样工作,这样当您更改它时,分配给它的变量也会更改。

我尝试创建一个字符串数组,然后将一个元素的引用分配给一个变量(我说引用是因为根据我的理解,Java 是按值传递的,而内存引用就是“值”)
当我更改 String 元素时,变量不会反射(reflect)更改。

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"

也许,根据我所读到的内容,赋值运算符对于字符串的工作方式并不相同。

最佳答案

字符串是不可变的。这意味着它们的值(value)永远不会改变。他们的引用可以重新分配,这就是这里发生的情况。

评论中的时间表:

// 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"

I say reference since from what I understand Java is pass by value and a memory reference is that "value"

几乎正确。
引用是一个地址。该值可以在该地址的内存中找到。

所以你拥有的是:
变量=人类可读。苹果。
引用=内存地址。计算机可读。
value = 内存中给定地址的一些字节。

所以当你这样做

 String s = arr[1];

您正在将链接到变量arr[1]的内存地址分配给变量s。 RAM 中的值未受影响且不会改变。

当你这样做

 arr[1] += "123r";

您正在创建一个全新的字符串。
扩展一下,这就是一步一步发生的事情。

arr[1] += "123r";
arr[1] = arr[1] + "123r";
arr[1] = "def" + "123r";
arr[1] = "def123r";

因此,arr[1] 被分配=
之后操作结果的内存地址/引用然而,此操作与变量 s 完全没有关系,因为该变量保存原始字符串的地址,并且没有代码来更新该引用/内存地址。

关于java - 为什么修改字符串数组元素时字符串没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56837455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com