为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2021-10-28 09:51:26
我有两个清单: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 的引用?
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

对于诸如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.

                  // so any change on where list1 points, happen for list2 reference too.

list1.add(1); // happen for list2

list1 = new ArrayList<>(); // doesn't happen for list2 because I change the address

                           // saved in list1 but list2 contains last address and work with last address

list1.add(5);

System.out.println(list2.get(0).get(0)); // print 1


查看完整回答
反对 回复 2021-10-28
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

是的,在 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) {

    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


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 240 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信