🗃️ 数组
什么是数组 · 创建与遍历 · 常见操作 · 二维数组 · Arrays 工具类
1. 什么是数组?为什么需要它?
📚 类比——课桌抽屉:数组就是一排编号的抽屉(0 号、1 号、2 号…)。
以前存 5 个分数要 5 个变量(s1,s2,s3,s4,s5),用数组只要一个变量名 + 编号:scores[0] ~ scores[4]。
最关键的是:编号可以用变量(scores[i]),配合循环一次处理所有抽屉!
以前存 5 个分数要 5 个变量(s1,s2,s3,s4,s5),用数组只要一个变量名 + 编号:scores[0] ~ scores[4]。
最关键的是:编号可以用变量(scores[i]),配合循环一次处理所有抽屉!
数组的特点:
- 存同一类型的多个值(都是 int 或都是 String)
- 长度固定:创建时定死,不能变(要变长用后面的 ArrayList)
- 下标从 0 开始:第 1 个元素是 arr[0]
数组的三种创建方式
// 方式 1:声明并指定长度(元素默认 0/null)
int[] scores = new int[5];
scores[0] = 90; // 给第 1 个赋值
// 方式 2:直接初始化(推荐,最直观)
int[] nums = {10, 20, 30, 40}; // 长度自动 = 4
// 方式 3:new + 初始化
String[] names = new String[]{"张三", "李四"};
🎯 必记
- 长度:arr.length(注意:没有括号,是属性不是方法)
- 最后一个元素:arr[arr.length - 1](下标越界是新手第一大错误!)
- 越界报错:ArrayIndexOutOfBoundsException(数组下标越界异常)
2. 遍历数组的两种写法?
for 循环遍历 + 增强 for
int[] nums = {10, 20, 30, 40};
// 方式 1:普通 for(需要下标时用——如求和、改值)
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
System.out.println("总和: " + sum);
总和: 100
// 方式 2:增强 for(只读遍历时用,更简洁)
for (int n : nums) { // 读作:for each n in nums
System.out.print(n + " ");
}
10 20 30 40
🎯 选择
- 需要下标 i(改值/找位置/两个数组联动)→ 普通 for
- 只要读一遍 → 增强 for(也更安全,不会越界)
3. 数组的经典操作套路?
求最大值/最小值
int[] nums = {34, 78, 12, 90, 45};
int max = nums[0]; // 假设第 1 个最大
for (int i = 1; i < nums.length; i++) {
if (nums[i] > max) max = nums[i]; // 发现更大的就换
}
System.out.println("最大: " + max);
最大: 90
数组反转(面试高频)
int[] a = {1, 2, 3, 4, 5};
int left = 0, right = a.length - 1;
while (left < right) { // 双指针向中间靠
int tmp = a[left]; // 交换三连
a[left] = a[right];
a[right] = tmp;
left++; right--;
}
// 结果:{5,4,3,2,1}
🎯 必会套路
- 求最大/最小:假设第一个,逐个比
- 交换两个元素:temp 临时变量三连(新手必须手写会)
- 查找元素位置:遍历 + 相等判断
4. 二维数组和 Arrays 工具类?
二维数组:数组的数组——像表格(行和列)。arr[行][列]。
二维数组:成绩表(3 行 4 列)
int[][] scores = {
{85, 90, 78, 92}, // 第 1 个学生 4 科成绩
{76, 88, 95, 70}, // 第 2 个学生
{90, 91, 87, 89} // 第 3 个学生
};
System.out.println(scores[1][2]); // 第 2 个学生的第 3 科 = 95
95
// 双层循环遍历(外层行,内层列)
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores[i].length; j++) {
System.out.print(scores[i][j] + " ");
}
System.out.println();
}
Arrays 工具类(java.util.Arrays,静态方法直接调):
| 方法 | 作用 | 例子 |
|---|---|---|
| Arrays.toString(a) | 把数组变成可读字符串 | [1, 2, 3](打印数组必用!) |
| Arrays.sort(a) | 升序排序(原地) | {3,1,2} → {1,2,3} |
| Arrays.binarySearch(a, x) | 二分查找(须先排序) | 返回下标或负数 |
| Arrays.fill(a, v) | 全部填充某值 | 初始化棋盘 |
| Arrays.copyOf(a, n) | 拷贝前 n 个 | 扩容数组 |
| Arrays.equals(a, b) | 比较两个数组内容 | == 比引用,这个比内容 |
✍️ 练习题
- 1. 创建一个 5 个元素的数组并循环赋值 1~5,再打印
- 2. 求数组 {5,9,3,7,1} 的最大值、最小值、总和、平均值
- 3. 统计数组中有几个偶数
- 4. 两个数组对比:{1,2,3} 和 {1,2,3} 用 == 判断是 true 还是 false?为什么?(答案:false,== 比的是引用;用 Arrays.equals)
- 5. 挑战:把数组 {1,2,3,4,5} 循环右移 1 位(变成 {5,1,2,3,4})
- 6. 挑战:找出数组中第二大的数