我有两个对象的ArrayLists(让我们说alOuter& 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?
答案 0 :(得分:2)
将alInner
添加到alOuter
时,您没有传递副本。您将多个相同的数组列表添加到alOuter
中。我可以看到您尝试清除数组列表,然后再将其添加到alOuter
。但是,这不会创建新的数组列表。因此,只要您清除alInner
,alOuter
的数组列表就会显示已更改。要解决此问题,您需要使用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
来创建一个新对象,因为当您传递对象时,对象通常不会自动创建。这就是价值类型的作用。