Java打印二维boolean数组输出[[Z@哈希值问题排查
问题成因
- 直接输出哈希格式的核心原因:Java中所有数组都是继承自Object的对象,直接将数组引用传入
System.out.print()时,默认会调用Object类的原生toString()方法,该方法的输出规则为数组类型编码@对象内存哈希值。你看到的[[Z@6d06d69c就是这个规则的产物:两个[代表二维数组层级,Z代表数组元素是boolean基本类型,后面的十六进制字符串是对象的内存地址哈希,完全不会输出数组内部存储的元素内容。 - 查阅同类问题仍无法解决的常见原因:很多教程提到使用
Arrays.toString()打印数组,但该方法仅适用于一维数组。对二维数组执行Arrays.toString()时,只会遍历最外层的一维元素,每个元素本质还是一维boolean数组,依然会输出哈希格式的内容,无法达到预期效果。 - 附带的代码逻辑问题(即便修正打印逻辑也会导致代码无法正常运行):
- 构造方法
Main(int rows, int cols)仅定义了2个入参,但main方法中调用构造方法时传入了3个参数new Main(6, 8, 10),存在参数个数不匹配的编译错误。 Board()方法的随机障碍物生成逻辑完全写反:boolean数组默认初始值全为false,但代码中判断“如果坐标位置为true就设为false”,该分支永远不会触发,循环内的自增变量i永远达不到终止条件,会直接造成死循环。- 随机坐标的范围与数组维度不匹配:原代码中随机生成的x范围是0到cols-1、y范围是0到rows-1,但二维数组的第一维长度是rows、第二维长度是cols,存在数组越界的风险。
- 构造方法
解决方法
1. 修正数组打印逻辑
对于二维嵌套结构的数组,使用JDK内置的Arrays.deepToString()方法递归遍历所有层级的数组元素,完成内容输出。具体操作:
- 导入
java.util.Arrays工具类 - 将原打印语句
System.out.print(m.Obstacle)替换为:
输出效果为直接展示数组所有元素值,格式类似System.out.println(Arrays.deepToString(m.Obstacle));[[false, true, false...], [false, false, true...]]。
如果需要更灵活的自定义排版(比如将true标记为障碍物、false标记为通路),可以通过双层循环遍历数组逐行输出,示例代码:
// 逐行遍历二维数组 for (boolean[] row : m.Obstacle) { for (boolean cell : row) { // 自定义单元格显示内容 System.out.print(cell ? "■ " : "□ "); } // 每行输出完成后换行 System.out.println(); }
2. 修正原有代码的逻辑错误
- 匹配构造方法的入参与调用参数:要么将main方法中构造方法调用的参数调整为和定义一致的2个值,要么补充构造方法的入参定义,保证参数数量、类型匹配。
- 修正障碍物生成的判断逻辑:将原判断条件反向,在随机坐标未被设置过障碍物时,将其标记为true并累计计数,直到生成指定数量的障碍物为止;同时调整随机数的范围匹配数组的维度长度,避免数组越界。修正后的核心方法参考:
import java.util.Random; public void Board() { int obstacleCount = 0; Random r = new Random(); // 循环生成5个障碍物 while (obstacleCount < 5) { // 随机坐标匹配数组的行、列长度 int rowIdx = r.nextInt(this.rows); int colIdx = r.nextInt(this.cols); // 仅当当前位置未设置障碍物时才标记,避免重复占用位置 if (!Obstacle[rowIdx][colIdx]) { Obstacle[rowIdx][colIdx] = true; obstacleCount++; } } }
内容的提问来源于stack exchange,提问作者pln
相关产品推荐
相关产品推荐

