我有两个对象的ArrayList(假设alOuter和alInner)-

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


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

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


这在这里工作正常,但是当我第二次或以后添加alInner时,alOuter内部先前位置的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吗?

最佳答案

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创建一个新对象,因为在您传递对象时,它们通常不会自动创建自己。这就是值类型的作用。

07-27 23:14