我在原始列表中添加了几个元素,并将其引用到新方法。在所谓的方法中,我再次向列表的新参考添加了更多元素,而不是将列表的新参考返回到呼叫者方法。但是,这些元素仍然被添加到原始列表中。有人可以解释它在内部发生的情况吗?新列表中的更改如何反映在原始列表中?
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");
}
}
参考实际上意味着对象所在的内存中的地址。因此,您通过同一列表,而不是它的副本。如果您想要列表的副本,则应在调用该方法之前将其复制到新列表。但是要小心,列表的简单副本仍然包含相同的对象(除非您也复制它们(,因此在调用程序中更改该方法内部列表中的对象。