字符串数组是否可变?

时间:2013-04-20 21:57:11

标签: java arrays string types mutable

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

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

提前致谢

4 个答案:

答案 0 :(得分:16)

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

this answer

对此进行了详细解释
  
      
  • 不变性意味着某种类型的物体不能以任何有意义的方式改变为外部观察者      
        
    • IntegerString等是不可变的
    •   
    • 通常所有的值类型都应该是
    •   
  •   
  • 数组对象是可变的      
        
    • 它可能是对不可变类型的引用数组,但数组本身是可变的      
          
      • 这意味着您可以将这些引用设置为您想要的任何内容
      •   
      • 同样适用于基元数组
      •   
    •   
    • 不可变数组不实用
    •   
  •   
  • 可以共享对象的引用      
        
    • 如果对象是可变的,那么将通过所有这些引用看到变异
    •   
  •   

编辑:

有点相关:Why can't strings be mutable in Java and .NET?

答案 1 :(得分:3)

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

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

您的阵列可以更改。字符串本身没有。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分: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"
    }
}

因此,如您所见,arr[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是不可变的(这是逻辑上的,因为String是不可变的。)

当您将数组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";
    }

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