为什么修改ArrayList参数而不修改String参数?
问题内容:
public class StackOverFlow {
public static void main(String[] args) {
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是“按值传递”并且String
s是不可变的
您打电话的时候
markAsNull(ArrayList<String> str)
str
将为ArrayList
指向相同的名称创建一个新的名称引用al
。当您add
将元素str
添加到同一对象时。稍后放到str
,null
但是该对象添加了新值,并由指向a1
。
您打电话的时候
markStringAsNull(String str)
{
str = str + "Append me";
// ...
}
该行通过附加给定的字符串来str = str + "Append me";
创建一个新String
对象,并将其分配给str
。但同样,它只是对实际字符串的引用,现在它指向新创建的字符串。(由于不可变),并且原始字符串不会更改。