You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:55:49