数组(array)用于保存一组有顺序、类型相同的数据。每个元素都通过下标访问;Java 数组创建后长度固定,不能直接 append、insert 或 pop。
创建数组
数组字面量适合已经知道元素的情况;new int[n] 则先创建 n 个格子。数组类型写在变量名前面,方括号说明“这是一组该类型的数据”。
int[] scores = {88, 91, 76, 95, 83};
int[] counts = new int[4];
counts[0] = 12;
counts[1] = 9;新数组会获得默认值:数值类型为 0,boolean 为 false,char 为空字符,对象引用(例如 String)为 null。数组的格子数由创建时决定。
知识测验
题目
new int[4] 创建后,四个元素的初始值是什么?
访问数组元素
数组下标(index)从 0 开始,所以第一个元素是 scores[0]。长度为 5 的数组,合法下标是 0、1、2、3、4;访问 scores[5] 会抛出 ArrayIndexOutOfBoundsException。
int[] scores = {88, 91, 76, 95, 83};
System.out.println(scores[0]); // 88
System.out.println(scores[4]); // 83
scores[2] = 80;
System.out.println(scores[2]); // 80互动实验
数组索引探照灯
访问权限免费
点击任意格子,让 Java 表达式准确指向一个元素。观察合法下标始终是 0 到 scores.length - 1。
知识测验
题目
int[] scores = {88, 91, 76}; 时,scores[2] 是多少?
数组长度与循环
数组使用字段 length,没有括号。最后一个合法下标是 array.length - 1。需要位置时使用普通 for;只读取每个值时,可以使用增强 for。
for (int i = 0; i < scores.length; i++) {
System.out.printf("scores[%d] = %d%n", i, scores[i]);
}
for (int score : scores) {
System.out.println(score);
}知识测验
题目
遍历整个数组时,哪个条件不会越界?
固定长度与常用操作
可以改写已有元素,也可以通过循环查找元素。这两种操作都不会增加或删除格子。
int[] values = {4, 0, 7, 0, 2, 9};
values[2] = 5;
for (int value : values) {
System.out.print(value + " ");
}知识测验
题目
关于 Java 数组,哪一句正确?
动手练习
把数组中的 0 移到末尾
- 使用 read 下标扫描每个元素。
- 使用 write 下标记录下一个非零元素应写入的位置。
- 扫描结束后,将 write 到数组末尾的格子全部补为 0。
动手练习
原地反转整数数组
使用两个下标 left 和 right,从数组两端向中间移动并交换元素。输入 {2, 4, 6, 8, 10},输出 {10, 8, 6, 4, 2}。
- 设置 left 指向首元素、right 指向末元素。
- 交换两端元素后同时向中间移动。
- 当 left 不再小于 right 时停止,并输出数组。