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);

原文地址:https://www.cnblogs.com/alavender/p/5827823.html