稀疏数组压缩适用于有效数据密度低的二维数组,如棋盘游戏、用户行为矩阵、科学计算矩阵和权限配置表;其结构为第0行存行列数和非零元素个数,后续每行存行索引、列索引和值;压缩还原纯Java实现,需校验合法性,且仅适用于规则矩形阵,不支持高频写入。

Java 二维数组在数据维度压缩处理中,最典型且实用的场景就是稀疏数组压缩——当二维数组中大量元素为零(或默认值),仅少数位置有有效数据时,直接存储会浪费大量内存。这时用稀疏数组替代,能显著减少空间占用,同时保持数据可还原性。
哪些情况适合用稀疏数组压缩?
不是所有二维数组都值得压缩。关键看有效数据密度:
- 棋盘类游戏状态(如五子棋、围棋):15×15 或 19×19 棋盘,实际落子通常不到 5%;
- 用户行为矩阵(如电商点击日志):用户ID × 商品ID 的大表,绝大多数组合无交互;
- 科学计算中的大型系数矩阵:有限元分析、图论邻接矩阵等,边/非零项占比极低;
- 配置或映射表:比如权限矩阵(角色 × 功能),多数角色只拥有少量权限。
稀疏数组怎么组织数据?
稀疏数组本身是一个固定结构的二维数组,格式统一:
- 第 0 行存三个整数:原数组行数、列数、非零元素总个数;
- 从第 1 行开始,每行存一个有效元素的三元组:行索引、列索引、值;
- 总行数 = 有效元素个数 + 1,列数恒为 3。
例如原数组是 11×11、含 8 个非零值,稀疏数组就是 9×3 的 int[][],比原数组节省约 93% 的存储空间(121 → 27 个 int)。
立即学习“Java免费学习笔记(深入)”;
压缩与还原的核心代码逻辑
压缩和还原不依赖第三方库,纯 Java 原生实现,逻辑清晰、可控性强:
- 压缩步骤:遍历原数组 → 统计非零个数 sum → 创建 new int[sum+1][3] → 填充首行(尺寸信息)→ 再次遍历填入坐标和值;
- 还原步骤:读取稀疏数组第 0 行 → new int[row][col] 创建新二维数组 → 从第 1 行起,按 sparse[i][0]、sparse[i][1] 定位赋值 sparse[i][2];
- 注意:还原前必须校验稀疏数组长度 ≥ 1 且第 0 行合法,避免 ArrayIndexOutOfBoundsException。
实际工程中要注意什么?
稀疏数组虽简单,但落地时容易踩坑:
- 原始数组行列不一致(如不规则二维数组)不能直接套用——稀疏数组只适用于规则矩形阵;
- 频繁随机写入不适合:每次增删都要重建稀疏数组,开销大于直接操作原数组;
- 若需持久化,建议序列化为文本(如 CSV)或二进制文件,首行仍保留尺寸元信息;
- 多线程环境下,稀疏数组本身不可变(构建后只读),但还原后的二维数组需自行加锁或使用不可变封装。


















