ArrayList添加新元素的覆盖问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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添加新元素的覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList中元素被新元素覆盖的问题

面试必问之ArrayList

将字符串“temp”值的每个新值添加到 ArrayList 而不覆盖以前的“temp”

13-Java-ArrayList

Java集合之ArrayList

添加新元素时,一个 ArrayList 的所有元素都会改变吗? [复制]