为什么修改ArrayList参数,但不是String参数?

这个问题在这里已经有了答案:

  • Java是“通过引用传递”还是“按值传递”? 78个答案

  • 在Arraylist字符串对象的情况下,添加的元素正在回归。 在String的情况下,方法调用对传递的字符串没有影响。

    这是因为Java是Pass-by-Value和String是不可变的

    你打电话时

    markAsNull(ArrayList<String> str)
    

    通过名称str的新引用为al指向的同一个ArrayList创建。 当你在stradd一个元素时,它会被添加到同一个对象中。 稍后,您将str放到null但该对象具有新值,并由a1指向。

    你打电话时

    markStringAsNull(String str)
    {
        str = str + "Append me";
        // ...
    }
    

    str = str + "Append me"; 通过附加给定的字符串并将其指定给str来创建一个新的String对象。 但是它又是对现在指向新创建的字符串的实际字符串的引用。 (由于不可变性),原始字符串不会更改。


    markXAsNull方法将本地引用设置为null 。 这对存储在该位置的实际值没有影响。 main方法仍然有它自己的值的引用,并可以使用这些调用println

    另外,在进行字符串连接时,在Object上调用toString() ,这就是为什么ArrayList以括号中的值列表形式输出。


    在Java中,您可以创建一个对象,并由多个指针引用。 在任何指针上调用增变器方法将有效地修改唯一对象,从而更新所有其他引用。

    但是如果你在一个引用上调用变量赋值语句,那么只会改变这个指针,因为它不会做任何对象的工作(这是我能解释的最好的...)。

    将对象传递给参数将有效地复制引用,从而生成单个对象,并带有两个指针 - 一个是全局的,另一个是本地的。

    还有一点,因为String是不可变的,所以实际上你会得到一个新的对象,与原始对象不同(因为你必须说a = a + "a" ),这就是为什么它不会修改原始字符串。

    链接地址: http://www.djcxy.com/p/3505.html

    上一篇: Why is an ArrayList parameter modified, but not a String parameter?

    下一篇: java array pass by reference does not work?