在java中使用ArrayList<ArrayList>时出现奇怪的结果<String>



我的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 ArrayListaddArray方法的自变量是对对象的引用,通过值传递。因此,在addArray方法之外,更改它不会产生任何效果。希望一切都清楚。

是的,对象在添加到集合时不会被克隆。

对于对象,Java总是传递引用值的副本,所以是的,您正在清除的ArrayList与您添加到另一个ArrayList的ArrayList相同。

相关内容

最新更新