当前位置: 首页 > 知识库问答 >
问题:

为什么当我修改原始数组列表[duplicate]时,复制的数组列表会被修改

柳越
2023-03-14
ArrayList<Integer> aList1=new ArrayList<Integer>();
ArrayList<Integer> aList2=new ArrayList<Integer>();
aList1.add(1);
aList2=aList1;
aList1.clear();

System.out.println(aList1.size());
System.out.println(aList2.size());

为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

共有1个答案

端木皓君
2023-03-14

当您进行这样的分配时:

aList2 = aList1;

当您更改aList1时,a List2将指向相同的内存地址。

假设你有一个这样的列表:

      +---+     +---+
O---> | 1 | --- | 2 |
      +---+     +---+

分配时:

aList2 = aList1;

它会是这样的:

                  +---+     +---+
      +--> L1---> | 1 | --- | 2 |
      |           +---+     +---+
      |
  L2--+

当您更改L1时

  aList1.clear();

其他列表也会受到影响

      +--> L1---> null
      |           
      |
  L2--+

要解决这个问题,您可以使用:

aList2 = new ArrayList<>(aList1);

这将返回:

0
1
 类似资料:
  • 问题内容: 我对map()的行为感到困惑。 我有一个这样的对象数组: 我将此数组传递给应该返回相同数组但所有产品均免费的函数: 函数是: 它返回以下数组: 所以我重写了我的职能是: 它将按预期返回数组。 但是!在那一刻,我放松了主意,在这两种情况下,我都修改了原始产品阵列。 有关map()的文档说不应这样做(https://developer.mozilla.org/en- US/docs/Web

  • 在一篇博客文章“PHP Internals:When does foreach copy”中,NikiC指出在下面这样的代码中:

  • 我想创建一个程序,允许用户删除员工与指定的工资单号码。 java(在其名为的包中) 当我输入工资单号码时,我的程序只识别第一个工作人员。任何其他工作人员都不会被‘发现’。我在哪里出了问题?如何从数组中删除特定的工资单号码并向用户请求另一个输入(直到数组为“空”)。

  • 我想把一个数组的不同数组元素组合(排列)放到一个列表中。我通过for循环交换数组的第一个和最后一个元素,组合(排列)被添加到列表中。然后,第二个元素和最后一个元素之前的元素被交换并添加到列表中,依此类推。假设数组是,添加到列表中的第一个元素将是。第二个元素是。但我最终得到的是列表中所有元素的。 问题是添加到List中的元素也会随着数组的当前修改而相应地修改。我最终在List中得到了类似的数组元素。

  • 问题内容: 我刚遇到一个很奇怪的东西。 为什么它会抬高而又改变内部? 问题答案: 正如我在评论中开始提到的那样,实际上是 在原地 修改列表,然后尝试将结果分配给元组中的第一个位置。从数据模型文档中: 调用这些方法以实现增强的算术分配(+ =,-=, =,/ =,// =,%=,* =,<< =,>> =,&=,^ =,| =)。这些方法应尝试就地进行操作(修改self)并返回结果(可以是,但不一定

  • 我需要创建一个客户列表,每个客户都有一个工作列表。当将一个列表分配给一个客户机时,它是通过引用传递的,对列表的任何更改(例如清除列表)也会反映在客户机对象中。 我该如何避免这种情况?