猿问

在 Java 中向列表添加值是复制数据还是创建引用?

我有两个清单:


List<Integer> l1 = new ArrayList<Integer>();


List<List<Integer>> l2 = new ArrayList<List<Integer>>();

我使用 将一些数字添加到我的列表 l1 中l1.add()。


我然后添加列表L1到第二列表L2(也就是现在的ArrayList的列表)使用l2.add(index, l1)。


然后我清除 l1,因为我想做其他计算并创建将再次添加到 l2 的列表。使用 完成清除l1.clear()。在清除 l1 时,我注意到 l2 也被清除了。是否l2.add()只创建对 l1 的引用?


慕斯王
浏览 241回答 2
2回答

泛舟湖上清波郎朗

对于诸如ArrayList等的对象,当您将它们传递给函数时(如此add处),您传递了它们地址的副本,因此函数可以工作或保存该地址(如此add处将其保存在第二个列表中),以便对该对象进行任何更改,例如clear将反映在第二个列表中,除非您创建一个新列表并将其分配给您的第一个列表(现在它引用了另一个地址),但您的第二个列表具有您最后一个列表的地址并对其进行处理。例如:List<Integer> list1 = new ArrayList<>();List<List<Integer> list2 = new ArrayList<>();list2.add(list1); // list2 contains reference to where list1 points, not to list1 itself.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // so any change on where list1 points, happen for list2 reference too.list1.add(1); // happen for list2list1 = new ArrayList<>(); // doesn't happen for list2 because I change the address&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// saved in list1 but list2 contains last address and work with last addresslist1.add(5);System.out.println(list2.get(0).get(0)); // print 1

婷婷同学_

是的,在 Java 中它使用已添加到列表的特定对象的引用。例如:让l1和l2两个列表。现在,String a="Some String";l1.add(a);l2.add(l1);这意味着l1在索引 0 处有a。而l2在索引 0 处有l1。情况 1:如果我们需要从L1 中获取 a 的值,那么它就像,l1.get(0);与l2相同的是,l2.get(0).get(0);现在你的答案:l1.clear();清除l1 的所有元素。因此,如何将您访问的值一结算后L1,因为它不存在。代码:import java.util.ArrayList;import java.util.List;public class demo {public static void main(String[] args) {&nbsp; &nbsp; List l1 = new ArrayList<>();&nbsp; &nbsp; List l2 = new ArrayList<>();&nbsp; &nbsp; String a = "some value";&nbsp; &nbsp; l1.add(a);&nbsp; &nbsp; l2.add(l1);&nbsp; &nbsp; System.out.println("l1 Size : " + l1.size());&nbsp; &nbsp; System.out.println("l2 Size : " + l2.size());&nbsp; &nbsp; l1.clear();&nbsp; &nbsp; System.out.println("l1 updated Size : " + l1.size());&nbsp; &nbsp; System.out.println("l2 updated Size : " + l2.size());&nbsp; }}输出:l1 Size : 1l2 Size : 1l1 updated Size : 0l2 updated Size : 1
随时随地看视频慕课网APP

相关分类

Java
我要回答