为什么在修改原始ArrayList时修改了复制的ArrayList

时间:2018-08-01 12:24:17

标签: java arraylist collections

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

1 个答案:

答案 0 :(得分:2)

当您进行这样的分配时:

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