即使新元素已添加到列表的其他参考文献,元素也会添加到原始列表中



我在原始列表中添加了几个元素,并将其引用到新方法。在所谓的方法中,我再次向列表的新参考添加了更多元素,而不是将列表的新参考返回到呼叫者方法。但是,这些元素仍然被添加到原始列表中。有人可以解释它在内部发生的情况吗?新列表中的更改如何反映在原始列表中?

package listDemo;
import java.util.ArrayList;
import java.util.List;
public class ListAddTest {
public static void main(String[] args) {
    List<String> fruitList = new ArrayList<String>();
      fruitList.add("Mango");
      fruitList.add("Banana");
      fruitList.add("Apple");
      System.out.println("Before addFruits :"+fruitList);
      addFruits(fruitList);
      System.out.println("After addFruits :"+fruitList);
}
private static void addFruits(List<String> newfruitsList){
    newfruitsList.add("Papaya");
    newfruitsList.add("Guava");
}
}

输出:

addfruits之前:[芒果,香蕉,苹果]

Addfruits之后:[芒果,香蕉,苹果,木瓜,番石榴]

解释如下:

public class ListAddTest {
public static void main(String[] args) {

//您在此处创建了一个新列表。

    List<String> fruitList = new ArrayList<String>();
      fruitList.add("Mango");
      fruitList.add("Banana");
      fruitList.add("Apple");
      System.out.println("Before addFruits :"+fruitList);

//您将同一列表传递给静态函数

      addFruits(fruitList);
      System.out.println("After addFruits :"+fruitList);
}

//原始列表的地址简单地复制到newfruitsList

private static void addFruits(List<String> newfruitsList){

//您将新元素添加到指向同一列表的newfruitsList参考

    newfruitsList.add("Papaya");
    newfruitsList.add("Guava");
}
} 

实现,您想要的

public class ListAddTest {
public static void main(String[] args) {
    List<String> fruitList = new ArrayList<String>();
      fruitList.add("Mango");
      fruitList.add("Banana");
      fruitList.add("Apple");
      System.out.println("Before addFruits :"+fruitList);

//使用new操作员在原始列表中创建一个newList

     List<String> newList= new ArrayList<String>(fruitList);
     addFruits(newList);
     System.out.println("After addFruits :"+fruitList);
     System.out.println("newList:"+newList);
}
private static void addFruits(List<String> newfruitsList){
    newfruitsList.add("Papaya");
    newfruitsList.add("Guava");
}
}

参考实际上意味着对象所在的内存中的地址。因此,您通过同一列表,而不是它的副本。如果您想要列表的副本,则应在调用该方法之前将其复制到新列表。但是要小心,列表的简单副本仍然包含相同的对象(除非您也复制它们(,因此在调用程序中更改该方法内部列表中的对象。

最新更新