我的android应用程序出现了一些奇怪的问题,我认为这可能与ArrayList的工作方式有关。检查以下代码,请告诉我我是否正确或做错了什么:
ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
ArrayList<String> tmp = new ArrayList<String>();
tmp.add("test");
arr.add(tmp);
tmp.clear();
在最后一行之后,arr[0]的内容被清空。那么,这是否意味着当将一个ArrayList添加到另一个时,它是通过引用来完成的?
所以如果我有以下方法:
void addArray(ArrayList<String> arr) {
group.add(arr); // group is ArrayList<ArrayList<String>>;
};
我必须把它改成:
void addArray(ArrayList<String> arr) {
ArrayList<String> tmp = new ArrayList<String>();
tmp.addAll(arr);
group.add(tmp); // group is ArrayList<ArrayList<String>>;
};
以确保如果我在其他地方清除传入数组,则组数组不会发生任何变化?
在Java中没有传递值,每个对象都是通过引用传递的。因此,在您的情况下,arr[0]
和tmp
是同一个对象,清除它将导致arr[0]
被清除。希望这能有所帮助。
编辑
作为问题第二部分的快速答案:您不需要在addArray
方法中使用tmp
ArrayList
。addArray
方法的自变量是对对象的引用,通过值传递。因此,在addArray
方法之外,更改它不会产生任何效果。希望一切都清楚。
是的,对象在添加到集合时不会被克隆。
对于对象,Java总是传递引用值的副本,所以是的,您正在清除的ArrayList与您添加到另一个ArrayList的ArrayList相同。