数组
什么是数组
数组(Array)是用来存储固定长度的、同数据类型的元素容器,在 Java 中是一种引用类型。
Java 中数组的特点:
- 数组中元素类型都相同。
- 数组一旦被创建,长度就不可改变。
- 数组中的每个元素都可以通过索引随机访问,索引从 0 开始递增。
- 数组中的元素都有默认的初始化值,整型是
0,浮点型是0.0,布尔型是false,字符型是'\u0000',引用类型是null。
声明数组
// 官方推荐写法
数据类型[] 数组名;
// 兼容 C 语言的风格(不推荐)
数据类型 数组名[];
示例:
int[] scores;
String names[];
初始化数组
静态初始化
声明时指定内容,编译器自动推断数组长度。
// 标准格式
数据类型[] 数组名 = new 数据类型[]{数组元素列表};
// 省略格式
数据类型[] 数组名 = {数组元素列表};
示例:
int[] scores = new int[] {10, 20, 30};
// 等价于
int[] scores = {10, 20, 30};
// 省略格式不允许分开写
int[] scores;
scores = {1,2,3}; // 编译错误
动态初始化
声明时指定长度,之后再填充内容。
// 先声明,后创建
数据类型[] 数组名;
数组名 = new 数据类型[数组长度]
// 声明时就分配空间
数据类型 数组名 = new 数据类型[数组长度]
示例:
int[] scores;
scores = new int[5];
String[] names = new String[5];
🔔 提示:
未填充内容时,数组中元素是默认初始化值,整型是
0,浮点型是0.0,布尔型是false,字符型是'\u0000',引用类型是null。
操作数组
访问元素
// 读取第一个元素
int first = scores[0];
// 修改第二个元素
scores[1] = 88;
📝 注意:
如果访问数组的索引超过数组范围,就会抛出
ArrayIndexOutOfBoundsException。
遍历数组
// 经典 for 循环,可读可写
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
// 增强 for-each,只能读不能写
for (int s : scores) {
System.out.println(s);
}
多维数组
多维数组本质是“数组的数组”,即数组中包含数组。
- 多维数组每行的列数可以不同。
int matrix[][] = new int[3][3]; // 可以省略列数 int matrix[][] = new int[3][]; // 但是不可以省略行数 int matrix[][] = new int[][3]; // 编译错误 int[][] matrix = new int[][] {{1}, {1, 2, 3}, {1, 2}}; // 等价于 int[][] matrix = {{1}, {1, 2, 3}, {1, 2}}; // 静态初始化时不能指定行数或列数 int[][] matrix = new int[3][] {{1}, {1, 2, 3}, {1, 2}}; // 编译错误 int[][] matrix = new int[3][3] {{1, 2, 3}, {1, 2, 3}, {1, 2, 3}}; // 编译错误 - 当多维数组未显式初始化时,其所有元素都是
null。int[][] matrix = new int[3][]; System.out.println(matrix[0]); // 输出 null
操作多维数组
访问多维数组元素
// 读取第 2 行第 3 列的元素
int value = matrix[1][2];
// 修改第 1 行第 2 列元素
matrix[0][1] = 10;
遍历多维数组
// 经典 for 循环,可读可写
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();
}
// 增强 for-each,只能读不能写
for (int[] row : matrix) {
for (int cell : row) {
System.out.print(cell + " ");
}
System.out.println();
}
多维数组的内存结构
Java 中多维数组的内存结构与 C 语言、Go 语言等的连续内存布不同,Java 中多维数组的元素实际上存储的是数组的引用,所以多维数组的行间地址是无序的,而且每行的列数也可以不同。
内存结构:
matrix[3][]
├── matrix[0] {1, 2, 3}
├── matrix[0] {4, 5, 6, 7}
└── matrix[0] {8, 9}

Comments NOTHING