为什么修改ArrayList参数,但不是String参数?
这个问题在这里已经有了答案:
在Arraylist字符串对象的情况下,添加的元素正在回归。 在String的情况下,方法调用对传递的字符串没有影响。
这是因为Java是Pass-by-Value和String
是不可变的
你打电话时
markAsNull(ArrayList<String> str)
通过名称str
的新引用为al
指向的同一个ArrayList
创建。 当你在str
上add
一个元素时,它会被添加到同一个对象中。 稍后,您将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"
),这就是为什么它不会修改原始字符串。
上一篇: Why is an ArrayList parameter modified, but not a String parameter?