【问题标题】:Why does function modify array[0] but not string in Java? [duplicate]为什么函数在 Java 中修改数组 [0] 而不是字符串? [复制]
【发布时间】:2016-06-10 16:45:54
【问题描述】:

代码

public class Foo {

    public static void main(String[] args) {

        //declaring and initializing String variable 'str' with value "outside"
        String str = "main";

        //declaring and initializing Array 'array' with values
        String [] array = {"main"};

        //printing values of str and array[0]
        System.out.println("str : " + str + " , array[0] : " + array[0]);

        //calling function foo()
        foo(str, array);

        //printing values after calling function foo()
        System.out.println("str : " + str + " , array[0] : " + array[0]);
    }

    static void foo(String str, String[] array){
        str = "foo";
        array[0] = "foo";
    }

}

输出

str : main , array[0] : main  
str : main , array[0] : foo

问题

为什么字符串str 仍然和“main”一样,但是array[0] 的值在调用函数foo() 后从“main”修改为“foo”?效果不应该一样吗?

【问题讨论】:

  • 您的方法不能更改字符串文字,因为它作为字符串文字按值传递,但数组可以作为为该数组传递的值是它的引用,因此您可以通过以下方式影响其内容它的参考。
  • Java 中的字符串必须是不可变的
  • 你不能修改一个字符串,因为它是一个不可变的对象。建议您使用 StringBuffer

标签: java arrays string methods


【解决方案1】:

不应该,因为 Java 处理引用的方式。

您为您的方法提供两个参数:一个字符串(即字符串的地址)和一个数组(即数组的地址)。这些地址在本地保存在strarray中,如果更改地址,方法外的地址(main()strarray)不会改变。

然后你创建一个字符串“foo”并将它(或者更确切地说,它的地址)分配给本地str。这不会对 main() 的 str 产生任何影响。但是,数组地址是本地的,但数组内部的不是。所以如果你会写

array = {"foo"};

这不会影响arraymain(),但与

array[0] = "foo";

您更改了内部作为参考的数组。

【讨论】:

    【解决方案2】:

    这是因为数组具有指向内存中对象的标头。数组实际上只是对其他地方的引用。因此,当您修改数组时,您正在修改指向内存中对象的元素 0。当您的方法退出时,您还没有修改 array[0] 引用,因此您指向的是内存中您更改对象所在的同一位置。

    另一方面,当您将字符串分配给“foo”时,实际上只是在方法范围内更改它,因为您正在将指针更改为新字符串。您必须返回字符串或将其重新分配给 main 方法中的引用,或者您可以将字符串设为始终具有相同引用的字段。

    这个链接可能比我更好地解释它。

    Does Java pass by reference or pass by value?

    【讨论】:

      【解决方案3】:

      在您的代码中,您将str 作为foo 的参数传递。在 java 中,当您将任何变量作为参数传递时,它就会变成新的东西。在foo 方法中更改str 只会更改str 而不会更改main str

      但是对于array,两个变量都是从相同的数据中获取的。这是因为数组是对象。当一个对象按值传递时,它会创建一个副本,但被复制的对象仍然引用相同的数据。

      这里解释得更好:Java pass by reference or by value

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 2021-05-18
        • 2016-09-28
        • 1970-01-01
        • 2010-12-20
        • 2019-03-19
        相关资源
        最近更新 更多