在屏幕坐标系中,gridi 对应坐标 (x=j, y=i);初始化需防行列顺序颠倒、负/零尺寸异常及稀疏数据滥用密集数组。

用 int[][] 表示坐标系时,行和列到底对应 x 还是 y?
Java 里二维数组本质是「数组的数组」,grid[i][j] 中 i 是外层数组索引(通常对应 **行号**),j 是内层数组索引(通常对应 **列号**)。在屏幕坐标系(如 Swing/AWT 或控制台打印)中,习惯上:
-
i→ 纵向位置(y 轴,从上到下递增) -
j→ 横向位置(x 轴,从左到右递增)
grid[2][5] 表示第 3 行、第 6 列的格子(0 起始),即坐标 (x=5, y=2)。这个映射不是语言强制的,但一旦选定就要全程一致,否则坐标计算会全错。初始化表格型二维数组要注意哪些边界陷阱?
声明 int[rows][cols] 后,所有元素默认为 0(数值类型),但容易忽略:
- 行列顺序写反:写成
new int[width][height]却按(x,y)访问,导致越界或逻辑颠倒 - 动态尺寸未校验:
rows或cols为负数或 0 时,new int[rows][cols]会抛NegativeArraySizeException - 稀疏数据硬套密集数组:比如只存几十个点却申请
1000x1000数组,浪费内存且遍历时效率低
if (rows <= 0 || cols <= 0) throw new IllegalArgumentException("rows and cols must be positive");用二维数组模拟棋盘类结构时,怎么安全访问相邻格子?
常见需求是获取上下左右或八邻域格子值,直接写 grid[i-1][j] 极易触发 ArrayIndexOutOfBoundsException。必须显式判断边界:
- 不依赖 try-catch 捕获异常来“试探”——性能差且掩盖逻辑缺陷
- 把边界检查抽成工具方法,例如
isValid(int row, int col)返回row >= 0 && row = 0 && col - 遍历邻域时先生成候选坐标对,再统一过滤,比嵌套 if 更清晰
int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
for (int[] d : dirs) {
int ni = i + d[0], nj = j + d[1];
if (isValid(ni, nj)) { /* 处理 grid[ni][nj] */ }
}当需要支持“坐标→值”随机访问,又不想浪费空间时,该选数组还是 Map?
如果坐标范围大(如 -10000 到 10000)但实际填充点极少(int[][] 会导致巨大空洞。此时应改用稀疏表示:
-
Map<point integer></point>(自定义Point或用Map<integer map integer>></integer>) - 或用字符串键:
Map<string integer></string>,键为"x,y"(简单但有装箱/拼接开销) - 数组仍适用场景:坐标连续、范围可控(如国际象棋
8x8、迷宫50x50)、需频繁整行/整列遍历
Point 作为 key 时必须重写 equals() 和 hashCode(),否则查找失效。二维数组模拟坐标系的关键不在语法,而在明确「索引到坐标的映射规则」并贯穿始终;边界检查不能省,稀疏性不能硬扛——选结构前先想清楚数据密度和访问模式。


















