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

时间:2019-07-01 14:27:16

标签: java arrays oop

我无法理解为什么String不能像对象那样工作,以致于当您更改它时,它分配给的变量也会改变。

我尝试制作一个字符串数组,然后将一个元素的引用分配给一个变量(之所以说引用,是因为从我的理解中,Java是按值传递,而内存引用就是“值”) /> 当我更改String元素时,变量无法反映更改。

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"

也许,从我一直在阅读的内容来看,赋值运算符不能像String那样工作。

3 个答案:

答案 0 :(得分:6)

字符串是不可变的。这意味着它们的价值永远不变。他们的引用可以重新分配,这就是这里的情况。

评论中的时间表:

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

之所以说引用,是因为从我的理解来看,Java是按值传递的,而内存引用就是“值”

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

所以您拥有的是:
变量=人类可读。苹果。
参考=内存地址。电脑可读。
值=内存中给定地址的一些字节。

所以当您这样做

 String s = arr[1];

您正在将链接到变量arr[1]的内存地址分配给变量s。 RAM中的值保持不变并且不变。

完成时

 arr[1] += "123r";

您正在创建一个全新的String。
展开这就是一步一步发生的事情。

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

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

答案 1 :(得分:1)

我们知道,字符串是java中的const变量。

  1. String[] arr={"abc","def"}

    const字符串变量池:“ abc”,“ def”

    arr [0]->“ abc”

    arr [1]->“ def”

  2. String s=arr[1]

    const字符串变量池:“ abc”,“ def”

    arr [0]->“ abc”

    arr [1]->“ def”

    s->“ def”

  3. arr[1]+="123r"

    const字符串变量池:“ abc”,“ def”,“ def123r”,“ 123r”

    arr [0]->“ abc”

    arr [1]->“ def123r”

    s->“ def”

答案 2 :(得分:1)

简而言之,可以预期您遇到的行为。在Java中,字符串被设计为不可变的,也就是说,它们的值不能更改。

字符串不变性是什么意思?

研究下面的代码段,并尝试预测不运行代码的输出。

 String s = "Stack";  
 s.concat(" overflow"); 
 System.out.println(s);

您期望输出是什么? 堆栈溢出对吗?不!输出为堆栈。您可以自己测试并查看。

这就是字符串的行为。

当然,我们可以通过执行以下操作来修改上面的代码库,使其以所需的方式工作:

 String s = "Stack";  
 s = s.concat(" overflow"); 
 System.out.println(s);

这样,将创建一个新对象,并且输出将变为堆栈溢出

我希望这会有所帮助。编码愉快! 编辑