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

Apache Commons CollectionUtils addAll引用传递致ListValuedMap值为空问题

问题解答

核心结论

是的,Java里所有对象类型的操作都是传递引用,而非拷贝对象——这和Collections.addAll无关,本质是你存入ListValuedMap的是同一个stockMetadata列表对象的引用。

问题原因

你每次调用map.put(key, stockMetadata)时,map中保存的并不是这个列表的副本,而是指向stockMetadata这个List对象的内存引用。之后执行stockMetadata.clear(),会直接修改这个被map引用的List对象本身,所以map里对应的所有列表都会变成空的。

Collections.addAll只是把元素的引用添加到stockMetadata列表中,它本身不会创建元素的副本,但这不是导致你问题的直接原因——真正的问题是你复用了同一个List对象并反复清空,而map里存的都是这个对象的引用。

解决方法

有两种常用的修复方式:

  • 存入map前创建列表副本:每次准备把列表存入map时,创建一个新的List对象来拷贝原列表的内容,比如:
    map.put(key, new ArrayList<>(stockMetadata));
    
    之后再调用stockMetadata.clear()只会清空原列表,map里的副本不受影响。
  • 每次循环创建新的列表:不要复用同一个stockMetadata对象,而是在每次需要存储数据时,新建一个List实例,比如:
    List<String> stockMetadata = new ArrayList<>();
    Collections.addAll(stockMetadata, ...);
    map.put(key, stockMetadata);
    // 不需要clear,因为下次循环会新建一个列表
    

内容的提问来源于stack exchange,提问作者cheese steak jimmy's

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:20