我有两个列表:
List<Integer> l1 = new ArrayList<Integer>();
List<List<Integer>> l2 = new ArrayList<List<Integer>>();
我使用l1.add()
在列表l1中添加了一些数字。
然后我使用l2.add(index, l1)
将列表l1添加到第二个列表l2(现在是Arraylist的列表)中。
然后我要进行其他计算时清除l1并创建将再次添加到l2的列表。使用l1.clear()
完成清除。
在清除l1时,我注意到l2也已清除。
l2.add()
是否仅创建对l1的引用?
答案 0 :(得分:2)
对于ArrayList
等对象,将它们传递给函数时(如此处的add
),您传递其地址的副本,以便函数可以工作或保存该地址(如{{ 1}},将其保存在第二个列表中),因此add
之类的对象上的任何更改都将反映在第二个列表中,除非您创建新列表并将其分配给第一个列表(现在它引用了另一个地址) ),但您的第二个列表具有您上一个列表的地址,并可以进行处理。
例如:
clear
答案 1 :(得分:0)
是的,在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 因为它不存在后如何访问 a 的值。
代码:
import java.util.ArrayList;
import java.util.List;
public class demo {
public static void main(String[] args) {
List l1 = new ArrayList<>();
List l2 = new ArrayList<>();
String a = "some value";
l1.add(a);
l2.add(l1);
System.out.println("l1 Size : " + l1.size());
System.out.println("l2 Size : " + l2.size());
l1.clear();
System.out.println("l1 updated Size : " + l1.size());
System.out.println("l2 updated Size : " + l2.size());
}
}
输出:
l1 Size : 1
l2 Size : 1
l1 updated Size : 0
l2 updated Size : 1