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

Spring Boot绘图项目Stack存图异常:元素全被覆盖问题求助

问题分析与解决方案

核心问题原因

你遇到的问题本质是栈中存储的是同一个集合对象的引用,而非独立的副本。每次添加新图形时,你只是修改了同一个集合的内容,然后重复将这个集合的引用压入栈中。栈内所有元素指向的都是内存中的同一个集合,因此当集合内容更新后,栈里所有“元素”看起来都变成了最后添加的图形状态。

解决方案

要解决这个问题,关键是每次压栈时,创建当前图形集合的独立副本,而不是直接存入原集合的引用。

代码修正示例

错误写法(模拟你的问题场景):

private List<Shape> currentShapes = new ArrayList<>();
private Stack<List<Shape>> undoStack = new Stack<>();

public void addShape(Shape shape) {
    currentShapes.add(shape);
    undoStack.push(currentShapes); // 错误:存入的是同一个List的引用
}

正确写法:

private List<Shape> currentShapes = new ArrayList<>();
private Stack<List<Shape>> undoStack = new Stack<>();

public void addShape(Shape shape) {
    currentShapes.add(shape);
    // 创建新的ArrayList副本,复制当前集合元素后压栈
    undoStack.push(new ArrayList<>(currentShapes));
}

进阶注意事项

如果你的Shape类是可变类(即对象内容可被修改),仅复制集合还不够,需要同时对每个Shape对象进行深拷贝:

// 假设Shape类实现Cloneable接口并重写clone方法
public void addShape(Shape shape) {
    // 先拷贝单个图形对象
    Shape clonedShape = (Shape) shape.clone();
    currentShapes.add(clonedShape);
    // 再拷贝整个集合
    undoStack.push(new ArrayList<>(currentShapes));
}

也可以通过拷贝构造函数创建新的Shape对象,避免后续修改原对象影响栈中存储的历史状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:25:27