Java中List<List<String>>实现问题:添加后始终重复最后一项
问题分析与解决方案
这问题我之前做项目时也踩过坑!核心原因是你一直在复用同一个surveillance列表对象,而不是每次添加时创建新的实例。
为什么会出现重复最后一项的情况?
Java里对象是引用传递的,当你把surveillance添加到外层列表survs时,存进去的并不是列表的副本,而是这个列表对象的内存引用。也就是说,survs里的所有元素其实都指向同一个surveillance列表:
- 第一次点击后,你修改了这个列表的内容并添加到
survs; - 第二次点击时,你又修改了同一个列表的内容,这时候
survs里的第一个元素(因为指向同一个对象)也会跟着变成新内容; - 最后打印
survs时,两个元素自然都是最后一次修改的结果。
而调用surveillance.clear()时,这个唯一的列表被清空,survs里所有引用指向的都是这个空列表,所以结果就是两个空数组。
修复方案:每次创建新的子列表
只需要在点击事件方法里每次新建一个ArrayList<String>实例,而不是复用类成员变量里的那个。修改后的代码如下:
// 可以把类里的surveillance成员变量删掉,或者不用它,每次方法内新建 public List<List<String>> survs = new ArrayList<>(); public int k=0; // 这个变量其实可以不用了,后面解释 public void handleAddSURVClick(ActionEvent actionEvent) { // 关键:每次点击都新建一个独立的子列表 List<String> surveillance = new ArrayList<>(); survName = name.getText(); max = maxp.getText(); min = minp.getText(); surveillance.add(survName); surveillance.add(monitoredObject); surveillance.add(monitoredProperty); surveillance.add(max); surveillance.add(min); // 直接追加到外层列表末尾,不需要指定k,ArrayList的add默认就是追加 survs.add(surveillance); // k++; // 这个变量可以删掉了 // 重置输入相关的变量和控件 survName = ""; name.clear(); max = ""; maxp.clear(); min = ""; minp.clear(); monitoredObject = ""; monitoredProperty = ""; }
为什么这样能解决问题?
每次点击事件触发时,都会创建一个全新的ArrayList<String>对象,这个对象和之前的子列表完全独立。把它添加到survs后,后续修改输入内容只会影响当前新建的列表,不会干扰已经存入survs的旧列表。
测试一下:提交两次后,survs里会是两个内容不同的独立子列表,不会再出现重复最后一项的情况。
内容的提问来源于stack exchange,提问作者yassinec
相关产品推荐
相关产品推荐

