在Java中将值添加到列表中是否会复制数据或创建引用?

时间:2018-10-05 05:02:52

标签: java list

我有两个列表:

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的引用?

2 个答案:

答案 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