【问题标题】:Why Copied ArrayList gets modified when I am modifying the original ArrayList [duplicate]为什么在我修改原始 ArrayList 时复制的 ArrayList 会被修改 [重复]
【发布时间】:2019-01-09 00:32:37
【问题描述】:
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());

为什么这两个列表的大小都为零?据我了解aList1.size() 应该是0aList2.size() 应该是1

【问题讨论】:

标签: java arraylist collections


【解决方案1】:

当您进行这样的分配时:

aList2 = aList1;

aList2 将指向与aList1 相同的内存地址,因为当您更改aList1 时,第一个也更改了。


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

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

当你分配时:

aList2 = aList1;

会是这样的:

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

当你改变 L1 时

  aList1.clear();

其他列表也会受到影响

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

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

aList2 = new ArrayList<>(aList1);

这将返回:

0
1

【讨论】:

  • 我知道如何解决这个问题,我想知道原因。
  • 我已经说了原因@008ak89 你看了我的回答了吗?
  • 那么为什么它对任何类都不同,Parent p1=new Parent();父 p2=p1; p1=空; System.out.println(p1); System.out.println(p2);
  • @008ak89 你是什么意思我没听明白?
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多