我正在尝试使用 java 中的列表,但我的代码中出现以下错误(见下文)。我创建一个新的列表对象 L1 并将其传递给函数 f。在函数 f 内,我创建了 L1 的副本并将其命名为 L2。我对 L2 执行添加操作并从函数返回。返回后,L1 的值发生了变化。怎么会这样?据我了解,L1 的范围不会扩展到函数 f,因此 L1 不能在函数 f 中更改。 L2 是 L1 的副本,并且是它自己的对象,因此对其进行的任何更改也不应该更改 L1。有人可以向我解释一下吗?
import java.util.List;
import java.util.ArrayList;
public class HelloWorld{
public static void main(String []args){
List<String> L1 = new ArrayList<String>();
L1.add("H");
L1.add("I");
System.out.println(L1);
f(L1);
System.out.println(L1);
}
public static void f(List<String> myList){
List<String> L2 = new ArrayList<String>();
L2 = myList;
L2.add("!");
return;
}
}
打印出来
[H, I]
[H, I, !]
最佳答案
问题是您正在创建一个新的 List
L2
然后用 L2 = myList
覆盖引用你应该添加每个 String
值来自 myList
反而。试试这个。
public static void f(List<String> myList) {
List<String> L2 = new ArrayList<>();
for(String str : myList) L2.add(str);
L2.add("!");
}
自 List
是一个对象,它作为方法 f
的引用传递因此,如果你这样做L2 = myList
你只是说L2
指向相同的List
如myList
。了解更多 here .
您也不必return
明确在void
中方法。
最后注意到你的方法 f
实际上并没有做太多事情,因为它只创建了一个本地新的 List
并且您不会归还它。
关于java - 对一个对象的更改无意中更改了另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62926335/