我有两个对象的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
。但是,这不会创建新的数组列表。因此,一旦您清除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
创建一个新对象,因为在您传递对象时,它们通常不会自动创建自己。这就是值类型的作用。