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

向嵌套ArrayList添加元素时其他元素被重置的技术问题求助

问题分析与解决方案

这绝对不是Java的Bug!问题出在集合引用复用上,我帮你拆解一下:

核心原因

你看到的“已存在元素被重置为新元素”,本质是因为你添加到Directions里的所有ArrayList<BlockPos>其实都是同一个对象的引用。

看你的代码片段:

ArrayList<BlockPos> Dir = new ArrayList<BlockPos>();
Dir = AStar.GetPath(Start, Goal, 350, false, true);
Dir = AStar.GetPath(Start, AStar.Closest, 450, false, true);

这里你虽然一开始new了一个ArrayList,但立刻被AStar.GetPath的返回值覆盖了——如果AStar.GetPath内部是复用同一个静态集合(比如每次调用只是清空旧元素、添加新元素,然后返回这个集合的引用),那么每次调用GetPath得到的Dir都是同一个对象。

当你把这个Dir添加到Directions里时,相当于给Directions里塞了多个指向同一个集合的引用。后续调用GetPath修改这个集合的内容时,所有引用都会同步看到变化,看起来就像是“旧元素被重置成新元素”了。

快速修复方案

不需要修改AStar的话,你可以在添加到Directions前,创建一个新的集合来拷贝Dir的元素,确保每个元素都是独立的:

// 替换原来的 Directions.add(Dir);
Directions.add(new ArrayList<>(Dir));

这样每次添加到Directions的都是全新的ArrayList,彼此之间不会互相影响。

根源修复(如果能修改AStar)

如果AStar是你自己实现的工具类,建议修改GetPath方法,让它每次返回新的ArrayList实例,而不是复用同一个。比如在方法内部:

public static ArrayList<BlockPos> GetPath(...) {
    ArrayList<BlockPos> path = new ArrayList<>();
    // 这里执行路径计算,填充path
    return path;
}

避免在AStar里使用静态集合来存储路径结果,从根源上解决引用复用问题。

内容的提问来源于stack exchange,提问作者user13241190

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:37:39