为什么修改ArrayList参数而不修改String参数?


问题内容

public class StackOverFlow {
public static void main(String[] args) {
ArrayList al = new ArrayList ();
al.add(“A”);
al.add(“B”);
markAsNull(al);
System.out.println(“ArrayList elements are “+al);


        String str = "Hello";
        markStringAsNull(str);
        System.out.println("str "+ str);
    }
    private static void markAsNull(ArrayList<String> str){
        str.add("C");
        str= null;
    }
    private static void markStringAsNull(String str){
        str = str + "Append me";
        str = null;
    }
}

输出:

ArrayList elements are [A, B, C]
str Hello

在的情况下ArrayList,将检索添加的元素。在String方法调用的情况下,对传递的String无效。JVM到底在做什么?谁能详细解释?


问题答案:

对于Arraylist字符串对象,将检索添加的元素。如果是String,则方法调用对传递的String无效。

发生这种情况是因为Java是“按值传递”并且Strings是不可变的

您打电话的时候

markAsNull(ArrayList<String> str)

str将为ArrayList指向相同的名称创建一个新的名称引用al。当您add将元素str添加到同一对象时。稍后放到strnull但是该对象添加了新值,并由指向a1

您打电话的时候

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

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