作为一名 Java 开发工程师,你一定在实际开发中遇到过需要处理表格、矩阵、图像像素、游戏地图等场景。这时候,二维数组(2D Array) 就派上用场了。
本文将带你全面掌握:
List>
)的互转并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、可维护性更高的 Java 多维数据处理逻辑。
在 Java 中,二维数组 实际上是一个“数组的数组” —— 即每个元素本身又是一个一维数组。
✅ Java 的二维数组是不规则的(Jagged Array),也就是说每一行的列数可以不同。
特点 | 描述 |
---|---|
数据类型一致 | 所有元素必须是相同的数据类型或其子类 |
索引从0开始 | 行索引和列索引都从0开始 |
不规则性 | 每一行的长度可以不同 |
固定大小 | 数组一旦创建,大小不可变(除非手动扩容) |
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int[][] matrix = new int[3][3]; // 3x3 的整型数组
matrix[0][0] = 1;
matrix[0][1] = 2;
// ...
int[][] triangle = new int[3][];
triangle[0] = new int[1];
triangle[1] = new int[2];
triangle[2] = new int[3];
int value = matrix[0][1]; // 获取第1行第2列的值
matrix[1][2] = 10; // 修改第2行第3列的值为10
int rows = matrix.length; // 行数
int cols = matrix[0].length; // 列数(假设每行长度一致)
for (int[] row : matrix) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
public static void printMatrix(int[][] matrix) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
int[][] copy = new int[matrix.length][];
for (int i = 0; i < matrix.length; i++) {
copy[i] = Arrays.copyOf(matrix[i], matrix[i].length);
}
由于数组大小固定,要“扩容”,只能重新创建新数组并复制:
int[][] newMatrix = Arrays.copyOf(matrix, matrix.length + 1);
newMatrix[matrix.length] = new int[]{10, 11, 12};
List> list = new ArrayList<>();
for (int[] row : matrix) {
List rowList = new ArrayList<>();
for (int val : row) {
rowList.add(val);
}
list.add(rowList);
}
List> list = ...;
int[][] result = new int[list.size()][];
for (int i = 0; i < list.size(); i++) {
List row = list.get(i);
result[i] = new int[row.size()];
for (int j = 0; j < row.size(); j++) {
result[i][j] = row.get(j);
}
}
// 矩阵加法
public static int[][] addMatrix(int[][] a, int[][] b) {
int rows = a.length;
int cols = a[0].length;
int[][] result = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
result[i][j] = a[i][j] + b[i][j];
}
}
return result;
}
Color[][] image = new Color[height][width];
// 设置某个像素的颜色
image[y][x] = new Color(255, 0, 0); // 红色
char[][] map = {
{'#', '#', '#', '#', '#'},
{'#', ' ', ' ', ' ', '#'},
{'#', 'P', ' ', ' ', '#'},
{'#', '#', '#', '#', '#'}
};
// P 表示玩家位置
String[][] data = new String[rowCount][colCount];
// 假设逐行读取 CSV
data[i] = line.split(",");
优化策略 | 说明 |
---|---|
使用基本类型数组 | 如 int[][] 比 Integer[][] 更省内存和更快 |
避免频繁扩容 | 尽量提前分配足够空间,避免反复新建数组 |
使用缓存友好顺序访问 | 先访问行再访问列(符合内存布局) |
使用并行流处理大数据 | 对大型二维数组可考虑使用 parallelStream() 并行处理 |
使用对象池管理大数组 | 对于频繁使用的大型二维数组,可复用对象减少 GC |
误区 | 正确做法 |
---|---|
认为二维数组一定是矩形 | 可以是不规则的(每行长度不同) |
直接比较两个二维数组是否相等 | 应使用 Arrays.deepEquals(arr1, arr2) |
忘记检查数组是否为空 | 使用前应判断 arr != null && arr.length > 0 |
在增强 for 中修改原始数组 | 增强 for 是只读的,需用普通 for 修改 |
使用 == 判断数组内容 | 应使用 Arrays.equals() 或 Arrays.deepEquals() |
误以为二维数组是连续内存块 | Java 中是数组的数组,不是 C/C++ 的连续内存 |
内容 | 说明 |
---|---|
定义方式 | int[][] matrix = new int[rows][cols] |
初始化方式 | 静态赋值、动态分配、不规则分配 |
访问方式 | matrix[row][col] |
遍历方式 | 普通 for、增强 for、流式处理 |
常见操作 | 打印、复制、扩容、转换为 List |
应用场景 | 矩阵计算、图像处理、游戏地图、表格解析 |
注意事项 | 不规则性、空指针检查、不能直接比较 |
性能优化 | 缓存友好访问、基本类型优先、避免频繁扩容 |
功能 | 示例 |
---|---|
定义二维数组 | int[][] arr = new int[3][3]; |
静态初始化 | int[][] arr = {{1,2}, {3,4}}; |
获取行数 | arr.length |
获取列数 | arr[0].length (假设每行长度一致) |
遍历二维数组 | for (int[] row : arr) for (int val : row) |
深度比较数组 | Arrays.deepEquals(arr1, arr2) |
打印数组内容 | 自定义打印方法或使用 Arrays.deepToString() |
转换为 List | 逐行添加到 List |
转换为 Map | 如 Map 表示坐标映射 |
使用流处理 | Arrays.stream(arr).flatMapToInt(Arrays::stream).sum() |
如果你正在准备一篇面向初学者的技术博客,或者希望系统回顾 Java 基础知识,这篇文章将为你提供完整的知识体系和实用的编程技巧。
欢迎点赞、收藏、转发,也欢迎留言交流你在实际项目中遇到的二维数组相关问题。我们下期再见
关注我,获取更多Java核心技术深度解析!