【问题标题】:Are String Arrays mutable?字符串数组是可变的吗?
【发布时间】:2013-04-14 02:04:09
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • Java 中的数组是可变的,它不依赖于数组类型,在任何情况下它们都是可变的。

标签: java arrays string types mutable


【解决方案1】:

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

这在this answer中有很好的解释:

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

编辑:

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

【讨论】:

    【解决方案2】:

    据我所知,您的数组中的字段将引用另一个字符串

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

    您的数组可以更改。字符串本身不是。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        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 元素是不可变的(这是合乎逻辑的,因为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";
            }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-24
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多