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

