ArrayList嵌套添加异常求助:添加后子列表均重复为最后一项
解决ArrayList嵌套添加元素时的引用覆盖问题
这问题我太熟了!本质是对象引用机制在搞鬼,咱们一步步拆解问题根源,再给你搞定的方案:
问题根源
你大概率是在循环外部初始化了arr2,然后每次读取一行后,清空arr2再添加新单词,最后把arr2加到arr1里。但ArrayList存储的是对象的引用地址,不是元素的副本!也就是说,arr1里的三个元素其实指向的是同一个arr2对象。当你最后一次循环修改arr2的内容时,所有指向它的引用都会同步显示最新内容,就出现了全是最后一行数据的情况。
解决方案
核心思路:每次循环都新建一个独立的arr2对象,而不是重复复用同一个。把arr2的初始化代码放到循环体内部,这样每处理一行文本,就生成一个全新的ArrayList来存当前行的单词,再把这个新对象加入arr1,确保每个元素都是独立的个体。
示例代码(Java)
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; public class WordListProcessor { public static void main(String[] args) { // 外层的ArrayList,存每行的单词列表 ArrayList<ArrayList<String>> arr1 = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader("your_text_file.txt"))) { String currentLine; // 循环读取每一行 while ((currentLine = reader.readLine()) != null) { // 关键:每次循环都新建一个arr2,而不是复用旧的 ArrayList<String> arr2 = new ArrayList<>(); // 按空格拆分单词(如果你的分隔符是其他的,比如逗号,就改这里) String[] words = currentLine.split("\\s+"); arr2.addAll(Arrays.asList(words)); // 将当前行的单词列表加入外层集合 arr1.add(arr2); } } catch (Exception e) { e.printStackTrace(); } // 现在输出的就是你期望的嵌套列表了 System.out.println(arr1); } }
避坑提醒
别图省事用arr2.clear()再复用对象——哪怕清空了元素,arr2还是原来的那个对象,arr1里的引用指向的还是它,最后依然会被覆盖。必须每次新建对象才能彻底解决问题。
内容的提问来源于stack exchange,提问作者Oualid Remal




