二维数组的定义与使用

在Java中,二维数组可以看作是一个“数组的数组”,即每个元素是一个一维数组。定义二维数组的语法如下:

// 方式1:直接初始化
int[][] matrix1 = {{1, 2, 3}, {4, 5, 6}};

// 方式2:先声明再分配空间
int[][] matrix2 = new int[2][3]; // 2行3列

二维数组元素的引用

通过行索引和列索引可以访问或修改二维数组的元素:

int value = matrix1[0][1]; // 获取第1行第2列的元素(值为2)
matrix2[1][2] = 10;       // 修改第2行第3列的元素为10

实用案例:矩阵乘法

两个矩阵相乘的条件是第一个矩阵的列数等于第二个矩阵的行数。示例代码如下:

public class MatrixMultiplication {
    public static void main(String[] args) {
        int[][] a = {{1, 2}, {3, 4}}; // 2x2矩阵
        int[][] b = {{5, 6}, {7, 8}}; // 2x2矩阵

        int[][] result = new int[a.length][b[0].length];
        
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b[0].length; j++) {
                for (int k = 0; k < b.length; k++) {
                    result[i][j] += a[i][k] * b[k][j];
                }
            }
        }

        // 输出结果矩阵
        for (int[] row : result) {
            for (int num : row) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }
}

输出结果为:

19 22 
43 50 

Arrays类的常用方法

java.util.Arrays类提供了操作数组的静态方法:

  • sort():对数组排序
  • binarySearch():二分查找
  • toString():转换为字符串
  • fill():填充数组

实用案例:按中文名称排序

使用Arrays.sort()结合自定义比较器可以实现中文排序:

import java.util.Arrays;
import java.util.Comparator;

public class ChineseSort {
    public static void main(String[] args) {
        String[] names = {"张三", "李四", "王五", "赵六"};
        
        Arrays.sort(names, Comparator.comparing(
            str -> str,
            (s1, s2) -> s1.compareTo(s2) // 按Unicode值比较
        ));

        System.out.println(Arrays.toString(names));
    }
}

数组实训任务

任务1:统计二维数组中的奇偶数

编写程序统计二维数组中奇数和偶数的个数。

任务2:数组元素交换

实现一个方法,将指定数组的指定索引位置的元素交换。

任务3:寻找鞍点

在二维数组中查找鞍点(即行中最大、列中最小的元素)。

任务4:数组去重

编写方法去除数组中的重复元素。

任务5:螺旋矩阵

生成并打印一个n×n的螺旋矩阵(数字从1开始螺旋递增)。

示例代码:螺旋矩阵生成

public class SpiralMatrix {
    public static int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int num = 1;
        int top = 0, bottom = n - 1, left = 0, right = n - 1;

        while (num <= n * n) {
            for (int i = left; i <= right; i++) matrix[top][i] = num++;
            top++;
            
            for (int i = top; i <= bottom; i++) matrix[i][right] = num++;
            right--;
            
            for (int i = right; i >= left; i--) matrix[bottom][i] = num++;
            bottom--;
            
            for (int i = bottom; i >= top; i--) matrix[i][left] = num++;
            left++;
        }
        return matrix;
    }

    public static void main(String[] args) {
        int[][] matrix = generateMatrix(4);
        for (int[] row : matrix) {
            System.out.println(Arrays.toString(row));
        }
    }
}

数组操作的最佳实践

  1. 边界检查:始终验证数组索引的有效性
  2. 使用增强for循环遍历数组更简洁
  3. 多维数组的实际内存分布是连续的
  4. System.arraycopy()比循环复制更高效
  5. 考虑使用ArrayList等集合类处理动态数组需求

性能优化技巧

  • 对于大型数组,并行排序Arrays.parallelSort()效率更高
  • 频繁插入/删除操作时,链表结构可能更合适
  • 基本类型数组比对象数组更节省内存

更多推荐