杰瑞科技汇

java string 二维数组

声明和初始化 String 二维数组

1 声明

声明一个 String 类型的二维数组,语法如下:

java string 二维数组-图1
(图片来源网络,侵删)
// 方式一:推荐,更清晰
String[][] names;
// 方式二:C/C++ 风格,在Java中也可以,但不推荐
String names[][];

2 初始化

初始化可以分为静态初始化和动态初始化。

静态初始化

在声明的同时就为数组分配空间并赋值。

// 3行4列的二维数组
String[][] students = {
    {"张三", "李四", "王五", "赵六"},
    {"钱七", "孙八", "周九", "吴十"},
    {"郑一", "王二", "冯三", "陈四"}
};
// 2行2列的二维数组
String[][] matrix = {
    {"Hello", "World"},
    {"Java", "Programming"}
};

动态初始化

先声明数组,然后分别指定行数和列数,再为每个元素赋值。

// 1. 声明一个3行2列的二维数组
String[][] cities = new String[3][2];
// 2. 为每个元素赋值
cities[0][0] = "北京";
cities[0][1] = "上海";
cities[1][0] = "广州";
cities[1][1] = "深圳";
cities[2][0] = "成都";
cities[2][1] = "重庆";

注意: Java 中二维数组不要求每一行的列数都相同(即“锯齿数组”),但这种情况较少使用,通常我们使用规则的二维数组。

java string 二维数组-图2
(图片来源网络,侵删)

访问和修改元素

使用 行索引列索引 来访问或修改特定位置的元素,索引从 0 开始。

String[][] students = {
    {"张三", "李四"},
    {"王五", "赵六"}
};
// 访问第1行第0列的元素 (索引从0开始)
String student = students[0][0]; // student 的值是 "张三"
System.out.println("第一个学生是: " + student);
// 修改第1行第1列的元素
students[0][1] = "孙八";
System.out.println("修改后的第二个学生是: " + students[0][1]); // 输出 "孙八"

遍历二维数组

遍历二维数组通常需要使用两层嵌套的 for 循环:外层循环遍历行,内层循环遍历列。

1 使用经典的 for 循环

String[][] matrix = {
    {"A", "B", "C"},
    {"D", "E", "F"},
    {"G", "H", "I"}
};
System.out.println("使用 for 循环遍历:");
for (int i = 0; i < matrix.length; i++) { // matrix.length 获取的是行数
    for (int j = 0; j < matrix[i].length; j++) { // matrix[i].length 获取的是第 i 行的列数
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println(); // 每行结束后换行
}

输出:

使用 for 循环遍历:
A B C 
D E F 
G H I 

2 使用增强型 for 循环 (for-each)

这种方式代码更简洁,但无法获取元素的索引。

java string 二维数组-图3
(图片来源网络,侵删)
String[][] matrix = {
    {"A", "B", "C"},
    {"D", "E", "F"},
    {"G", "H", "I"}
};
System.out.println("\n使用增强型 for 循环遍历:");
for (String[] row : matrix) { // 外层循环遍历每一行(每一行是一个 String[] 数组)
    for (String element : row) { // 内层循环遍历当前行的每一个元素
        System.out.print(element + " ");
    }
    System.out.println();
}

输出:

使用增强型 for 循环遍历:
A B C 
D E F 
G H I 

获取二维数组的维度

  • 行数: array.length
  • 列数: array[0].length (获取第一行的长度,前提是数组至少有一行)
String[][] data = {
    {"Row1-Col1", "Row1-Col2"},
    {"Row2-Col1", "Row2-Col2", "Row2-Col3"}, // 这是一个非规则数组
    {"Row3-Col1"}
};
int rows = data.length;
System.out.println("行数: " + rows); // 输出 3
// 列数不固定,需要分别获取每一行的列数
for (int i = 0; i < data.length; i++) {
    int cols = data[i].length;
    System.out.println("第 " + (i + 1) + " 行的列数: " + cols);
}

输出:

行数: 3
第 1 行的列数: 2
第 2 行的列数: 3
第 3 行的列数: 1

完整示例代码

下面是一个综合性的示例,展示了如何声明、初始化、修改、遍历和打印一个 String 二维数组。

public class String2DArrayExample {
    public static void main(String[] args) {
        // 1. 静态初始化一个学生成绩表
        String[][] gradeBook = {
            {"张三", "语文", "95"},
            {"李四", "数学", "88"},
            {"王五", "英语", "92"},
            {"赵六", "物理", "85"}
        };
        // 2. 访问并打印某个学生的信息
        System.out.println("第一个学生的姓名是: " + gradeBook[0][0]);
        System.out.println("第一个学生的科目是: " + gradeBook[0][1]);
        System.out.println("第一个学生的成绩是: " + gradeBook[0][2]);
        // 3. 修改某个学生的成绩
        System.out.println("\n将李四的数学成绩从 " + gradeBook[1][2] + " 改为 95");
        gradeBook[1][2] = "95";
        // 4. 遍历并打印整个成绩表
        System.out.println("\n--- 完整成绩表 ---");
        // 打印表头
        System.out.println("姓名\t科目\t成绩");
        System.out.println("--------------------");
        // 遍历数据
        for (int i = 0; i < gradeBook.length; i++) {
            for (int j = 0; j < gradeBook[i].length; j++) {
                System.out.print(gradeBook[i][j] + "\t"); // \t 是制表符,用于对齐
            }
            System.out.println(); // 每行结束后换行
        }
        // 5. 使用增强型for循环遍历
        System.out.println("\n--- 使用增强型for循环遍历 ---");
        for (String[] record : gradeBook) {
            for (String info : record) {
                System.out.print(info + "\t");
            }
            System.out.println();
        }
    }
}

输出结果:

第一个学生的姓名是: 张三
第一个学生的科目是: 语文
第一个学生的成绩是: 95
将李四的数学成绩从 88 改为 95
--- 完整成绩表 ---
姓名    科目    成绩
--------------------
张三    语文    95  
李四    数学    95  
王五    英语    92  
赵六    物理    85  
--- 使用增强型for循环遍历 ---
张三    语文    95  
李四    数学    95  
王五    英语    92  
赵六    物理    85  

常见错误

  1. ArrayIndexOutOfBoundsException (数组越界异常)

    • 原因: 尝试访问一个不存在的索引。
    • 示例:
      String[][] arr = new String[2][2];
      // arr 只有 2 行 (0, 1) 和 2 列 (0, 1)
      String s = arr[2][0]; // 错误!行索引 2 超出范围
      String t = arr[0][2]; // 错误!列索引 2 超出范围
  2. NullPointerException (空指针异常)

    • 原因: 尝试在一个为 null 的数组或其行上操作。

    • 示例:

      String[][] arr = null;
      arr[0][0] = "Hello"; // 错误!arr 本身是 null
      String[][] arr2 = new String[2]; // 只分配了行,行内的元素是 null
      arr2[0][0] = "Hello"; // 错误!arr2[0] 是 null
      // 正确的做法是先初始化每一行
      arr2[0] = new String[2];
      arr2[0][0] = "Hello";

希望这个详细的解释能帮助你完全理解 Java 中的 String 二维数组!

分享:
扫描分享到社交APP
上一篇
下一篇