Java 中二维数组存储栈时避免对象引用共享的正确实践

在 java 中使用二维数组存储 stack 对象时,若所有数组元素指向同一个 stack 实例,对任一位置的修改将影响全部位置;正确做法是为每个数组单元独立初始化新 stack 实例。

当你声明 Stack[][] gameboard = new Stack[3][3] 时,你创建的是一个 3×3 的引用数组,其每个元素初始值为 null。关键问题在于:Stack 是引用类型,赋值操作(如 gameboard[i][j] = square)复制的是引用,而非对象本身

在原始代码中:

public Stack Square = new Stack<>();
Square.push(0);
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        GameBoard[i][j] = Square; // ❌ 所有位置都指向同一个 Stack 实例
    }
}
GameBoard[1][1].push(1); // ✅ 修改的是唯一那个 Stack → 全部“看到

”该变化

由于 GameBoard[i][j] 均引用同一 Square 对象,调用任意位置的 .push() 实际都在操作同一个底层数据结构(Stack 内部的 Vector 或 ArrayDeque),因此表现为“所有栈同步更新”。

✅ 正确解法:为每个二维索引独立创建新 Stack 实例:

public Stack[][] gameboard = new Stack[3][3];

public Stack[][] fillBoard() {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            Stack square = new Stack<>(); // ✅ 每次循环新建独立栈
            square.push(0);                        // 初始化默认值
            gameboard[i][j] = square;
        }
    }
    gameboard[1][1].push(1); // 仅修改 [1][1] 位置的栈
    return gameboard;
}

? 注意事项

  • Java 中 new Stack() 每次调用都会分配全新对象,确保内存隔离;
  • 避免使用静态集合或共享实例作为模板(除非明确需要全局状态);
  • 若需批量初始化相同内容,可封装为工具方法,但务必保证每次返回新实例;
  • 现代 Java 推荐优先使用 Deque(如 ArrayDeque)替代 Stack(后者已属遗留类,非线程安全且性能较差)。

? 验证效果:执行后 gameboard[0][0] 仍为 [0],gameboard[1][1] 为 [0, 1],其余为 [0] —— 各栈行为完全独立,符合预期。