8

我想知道 Java 中的字符串数组是否是可变的?我知道字符串是不可变的,但是字符串数组呢?

如果我有一个字符串数组并更改内容,是否会创建一个新的字符串对象?还是会改变实际值?

提前致谢

4

4 回答 4

19

中包含的StringsString[]确实是不可变的,但是数组是可变的。

这在这个答案中得到了很好的解释:

  • 不变性意味着某种类型的对象不能以任何有意义的方式改变外部观察者
    • Integer, String, 等是不可变的
    • 通常所有值类型都应该是
  • 数组对象是可变的
    • 它可能是对不可变类型的引用数组,但数组本身是可变的
      • 这意味着您可以将这些引用设置为您想要的任何内容
      • 也适用于基元数组
    • 不可变数组不实用
  • 可以共享对对象的引用
    • 如果对象是可变的,则通过所有这些引用可以看到突变

编辑:

有点相关:为什么字符串在 Java 和 .NET 中不能是可变的?

于 2013-04-20T22:00:15.950 回答
5

据我记得你的数组中的字段将引用另一个字符串

String[] array {"I","like","rain"};
array[2] = "sun"

你的数组可以改变。字符串本身不是。

于 2013-04-20T22:00:48.040 回答
1

在数组中,每个元素只是一个指向对象的指针。所以,当你做类似的事情时

String one = "1";
String two = "2";
String three = "3";
String four = "4";
String[] myStringArray = {one, two, three};
myStringArray[2] = four;

然后,位于数组第三个元素的指针现在指向4而不是3

于 2013-04-20T22:02:04.937 回答
1

正如某些人所说,该String[]数组不包含对字符串变量的引用。该String[]数组包含值(或更确切地说是对值的引用),但不包含对变量的引用。

public class Main {
    public static void main(String[] args) {

        String one="1";
        String two="2";

        String[] arr = {one, two};

        System.out.println(arr[1]);
        // Result is "2"

        two="3";

        System.out.println(arr[1]);
        // Result is still "2"
    }
}

因此,如您所见, thearr[1]不是对String two. 它从变量中获取值,仅此two而已。更改变量two并没有影响arr[1]

同样的事情ArrayList


//...

    String one="1";
        String two="2";
    List arr2 = new ArrayList<String>();
        
        arr2.add(one);
        arr2.add(two);
        
        System.out.println(arr2.get(0));
   // Result is "1"

        one = "one";
        System.out.println(arr2.get(0));
   // Result is still "1", not "one"

//...

因此数组String元素是不可变的(这是合乎逻辑的,因为Strings 是不可变的)。

当您将数组arrarr2它们本身(而不是它们的不可变String元素)传递给过程时,就会发生可变性。

例如:

   change(arr);
   // where arr is a String[] array of {"1","2"}
   // see the procedure below

     System.out.println(arr[0]);
  // Result is "one"
  
        
  // ...
    
    static void change(String[] someArray){
        someArray[0]="one";
    }

换句话说,数组是通过引用传递的(=可变的),但它的字符串元素是通过值传递的(不可变的)。

于 2020-08-03T19:04:16.423 回答