首页 > 代码库 > ArrayList添加新元素的覆盖问题
ArrayList添加新元素的覆盖问题
首先,看一个代码段:
1. ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
2. ArrayList<String> str = new ArrayList<String>();
3 . for(int i = 0;i<5;i++){
4. str.add(i+"");
5. list.add(str);
6. System.out.println(list);
7. }
8. System.out.println(list);
期望的输出应该为:[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
但实际的输出为:[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
为什么会出现这种情况呢?
这是因为ArrayList的add()方法在添加的是对象的引用,所以在这里for循环中每次添加的是同一个引用,每添加一次的时候,实际上在增加一个该对象引用的同时,更新了之前添加的元素(覆盖了之前添加的元素),所以和期望出现的不一致。
解决方法:
在循环中,new一个新的引用,指向和想添加引用指向的内容一样,这样每次添加的引用也就不相同了,也不会出现覆盖的情况了。针对上面的代码来说,只需将第5行修改为:
ArrayList<String> t_str = new ArrayList<String>(str);
list.add(t_str);
ArrayList添加新元素的覆盖问题