知识点:二维数组的概念、声明初始化、元素访问、遍历、常见应用
一、二维数组是什么
二维数组:数组的每个元素,又是一个一维数组。
可以理解成:
- 一维数组:一排数据;
- 二维数组:一张表格 / 矩阵,有行和列。
比如:
int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };二、二维数组的声明和初始化
2.1 声明格式
数据类型[][] 数组名;示例:
int[][] arr;2.2 静态初始化:直接给出每行元素
数据类型[][] 数组名 = { {元素1, 元素2, ...}, {元素1, 元素2, ...}, ... };代码示例:
public class TwoArrayDemo1 { public static void main(String[] args) { // 静态初始化:3行3列 int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; System.out.println(arr[0][0]); // 输出1 System.out.println(arr[1][2]); // 输出6 } }2.3 动态初始化:先指定行数和列数
数据类型[][] 数组名 = new 数据类型[行数][列数];代码示例:
public class TwoArrayDemo2 { public static void main(String[] args) { // 动态初始化:2行3列 int[][] arr = new int[2][3]; // 赋值 arr[0][0] = 10; arr[0][1] = 20; arr[0][2] = 30; arr[1][0] = 40; arr[1][1] = 50; arr[1][2] = 60; System.out.println(arr[1][1]); // 输出50 } }注意:动态初始化后,元素默认值和一维数组一样,
int默认0,double默认0.0等。
三、二维数组元素的访问和赋值
3.1 访问元素
格式:
数组名[行索引][列索引];示例:
public class TwoArrayDemo3 { public static void main(String[] args) { int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; System.out.println(arr[0][1]); // 输出2 System.out arr[1][0]); // 输出4 System.out.println(arr[2][2]); // 输出9 } }3.2 赋值
数组名[行索引][列索引] = 值;示例:
public class TwoArrayDemo4 { public static void main(String[] args) { int[][] arr = new int[2][2]; arr[0][0] = 100; arr[0][1] = 200; arr[1][0] = 300; arr[1][1] = 400; System.out.println(arr[1][1]); // 输出400 } }四、二维数组的遍历
4.1 普通双层 for 循环遍历
public class TwoArrayDemo5 { public static void main(String[] args) { int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 外层循环:遍历每一行 for (int i = 0; i < arr.length; i++) { // 内层循环:遍历当前行的每一列 for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); // 一行结束换行 } } }输出:
1 2 3 4 5 6 7 8 9说明:
arr.length:二维数组的行数;arr[i].length:第i行的列数。
4.2 for-each 遍历(增强 for 循环)
public class TwoArrayDemo6 { public static void main(String[] args) { int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 外层for-each:遍历每一行 for (int[] row : arr) { // 内层for-each:遍历当前行每个元素 for (int num : row) { System.out.print(num + " "); } System.out.println(); } } }附:for-each语法
Java for-each(增强 for 循环)
语法:
for(元素类型 变量名 : 数组/集合)作用:遍历数组、集合,只读,不能拿到索引,不能直接修改原数组元素引用。
1. 遍历数组
int[] arr = {10,20,30}; for(int num : arr){ System.out.println(num); }等价普通 for:
for(int i=0;i<arr.length;i++){ int num = arr[i]; System.out.println(num); }2. 遍历集合(ArrayList)
import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); for(String s : list){ System.out.println(s); } } }3. 重要特点
✅ 优点:代码简洁,不用下标 ❌ 缺点:
- 没有索引,不能获取当前是第几个元素
- 遍历集合时不能增删元素,会抛
ConcurrentModificationException - 基本类型数组:只能读取值,修改循环内变量不会改变原数组
int[] arr = {1,2}; for(int x : arr){ x = 100; // 只是修改副本,原数组不变 }4. 底层原理
for-each 本质是迭代器 Iterator语法糖,只要实现Iterable接口的类都能用增强 for。
5. C++ for-each(C++11 范围 for)
int arr[] = {1,2,3}; for(int x : arr){ cout << x << endl; } // 引用版本,可以修改原数组 for(int &x : arr){ x *=2; }五、二维数组的常见操作
5.1 求所有元素总和
public class TwoArrayDemo7 { public static void main(String[] args) { int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int sum = 0; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { sum += arr[i][j]; } } System.out.println("总和:" + sum); // 45 } }5.2 求最大值
public class TwoArrayDemo8 { public static void main(String[] args) { int[][] arr = { {12, 45, 9}, {68, 23, 56}, {33, 72, 19} }; int max = arr[0][0]; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { if (arr[i][j] > max) { max = arr[i][j]; } } } System.out.println("最大值:" + max); // 72 } }5.3 二维数组转置(行列互换)
public class TwoArrayDemo9 { public static void main(String[] args) { int[][] arr = { {1, 2, 3}, {4, 5, 6} }; // 新建转置数组:原来的行变成列,原来的列变成行 int[][] transpose = new int[arr[0].length][arr.length]; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { transpose[j][i] = arr[i][j]; } } // 输出转置结果 for (int i = 0; i < transpose.length; i++) { for (int j = 0; j < transpose[i].length; j++) { System.out.print(transpose[i][j] + " "); } System.out.println(); } } }输出:
1 4 2 5 3 6六、二维数组的内存理解(初学者先了解即可)
二维数组其实是 “数组的数组”:
- 二维数组变量保存的是整体地址;
- 每一行保存的是一维数组地址;
- 真正的数据存放在每个一维数组元素中。
简单记忆:
arr[i][j]表示:第i行,第j列。
本章小结
- 二维数组:元素是一维数组,适合表示表格、矩阵。
- 初始化:静态初始化直接写每行;动态初始化指定行数和列数。
- 访问元素:
数组名[行索引][列索引],索引从 0 开始。 - 遍历:双层 for 循环,外层遍历行,内层遍历列。
- 常见操作:求和、求最大值、转置。