
在使用 Uniform Cost Search 实现 AI 游戏(如叠方块)时,若直接将 this 添加到 ArrayList 中,所有元素实际指向同一内存地址,导致看似“添加了多个状态”,实则只保存了最终修改后的单一状态。根本原因在于 Java 的引用传递特性与对象浅拷贝误区。 在使用 Uniform Cost Search 实现 AI 游戏(如叠方块)时,若直接将 `this` 添加到 `ArrayList` 中,所有元素实际指向同一内存地址,导致看似“添加了多个状态”,实则只保存了最终修改后的单一状态。根本原因在于 Java 的引用传递特性与对象浅拷贝误区。问题核心并非语法错误,而是对 Java 对象模型的典型误解:moves.add(this) 并非“保存当前棋盘快照”,而是将当前 Table 实例的引用存入列表。由于循环中反复调用 cube.setPosX() / cube.setPosY() 修改同一组 Cube 对象,且 this.setCubes(currentTable) 始终复用原始列表,所有 moves 元素最终都反映最后一次修改后的状态——这就是为何 moves.get(0).printTable() 与 moves.get(anyIndex).printTable() 输出完全一致。要真正生成独立的状态副本,必须进行深拷贝(Deep Copy)。Table 类需提供显式的复制构造函数或 clone() 方法,确保每个新 Table 实例拥有自己独立的 ArrayList 及其中每个 Cube 的副本:moves.add(this)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










