为什么在另一个ArrayList <obj>中添加ArrayList <object>会替换前一个位置的内部ArrayList <obj>的值

时间:2018-02-08 06:44:54

标签: android list object arraylist

我有两个对象的ArrayLists(让我们说alOuter&amp; alInner) -

ArrayList<ObjectName>alOuter=new ArrayList<>();
ArrayList<ObjectName>alInner=new ArrayList<>();

我需要在alOuter中添加alInner,如 -

alOuter.add(new ObjectName("some value",alInner));

这在这里工作正常,但是当我第二次或第四次添加alInner时,alInner在先前位置的alInner值被替换为alInner的当前值。

像 -

alInner.add(new ObjectName("1","A"));
alOuter.add(new ObjectName("some value",alInner));

alInner.clear();
alInner.add(new ObjectName("2","B"));
alOuter.add(new ObjectName("some value",alInner));

alInner.clear();
alInner.add(new ObjectName("3","C"));
alOuter.add(new ObjectName("some value",alInner));

现在每个位置的alOuter值都是 -

"some value",("3","C")

为什么要替换之前位置的值? 有没有其他方法可以在另一个ArrayList中添加ArrayList?

1 个答案:

答案 0 :(得分:2)

alInner添加到alOuter时,您没有传递副本。您将多个相同的数组列表添加到alOuter中。我可以看到您尝试清除数组列表,然后再将其添加到alOuter。但是,这不会创建新的数组列表。因此,只要您清除alInneralOuter的数组列表就会显示已更改。要解决此问题,您需要使用new

创建新的数组列表
alInner = new ArrayList<>(); // do this in place of clear.

可替换地,

// this copies the stuff inside alInner to a new array list
alOuter.add(new ObjectName("some value",new ArrayList<>(alInner)));

正如您所看到的,在这种情况下,您必须使用new来创建一个新对象,因为当您传递对象时,对象通常不会自动创建。这就是价值类型的作用。