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
相关产品推荐
相关产品推荐

