java - 对一个对象的更改无意中更改了另一个对象

标签 java list object

我正在尝试使用 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指向相同的ListmyList 。了解更多 here .

您也不必return明确在void中方法。

最后注意到你的方法 f实际上并没有做太多事情,因为它只创建了一个本地新的 List并且您不会归还它。

关于java - 对一个对象的更改无意中更改了另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62926335/

相关文章:

java - 创建 Mac .app 文件 : How to set the WorkingDirectory to parent path?

java - neo4j 一直报错并且无法运行,你能帮我解决它的错误吗?

PHP:以 OOP 方式搜索 CSV 文件

JavaScript。为什么创建新对象时会覆盖私有(private)函数?

java - 这条语句中的SQL异常是在哪里捕获的呢?

java - 找不到依赖项 : Spring MVC 类型的匹配 bean

Python列表减法运算

Python - 迭代 list.append 的结果

python - 访问排序嵌套列表的第一个元素以获取第二小的第二个元素

javascript - ExtJS 过滤组合框存储