练习——找出一个数组的最大数并放在最后一个元素的下一位
需求
- 找出数组中的最大值
- 将数组”扩容”一位,把最大值放入新增的最后一位
- 遍历输出结果
示例代码
public static void main(String[] args) {
int[] a = {1, 24, 56, 78, 76, 342, 65, 4};
// 1. 找出最大值
int max = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] > max) {
max = a[i];
}
}
// 2. 数组"扩容"一位,将最大值放入末尾
a = Arrays.copyOf(a, a.length + 1);
a[a.length - 1] = max;
// 3. 遍历输出
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}Code language: JavaScript (javascript)
输出结果:
1
24
56
78
76
342
65
4
342
关键注意点
1. a 的前后区别
| 阶段 | a 指向的数组 | a.length |
|---|---|---|
| 初始 | {1, 24, 56, 78, 76, 342, 65, 4} | 8 |
Arrays.copyOf 之后 | {1, 24, 56, 78, 76, 342, 65, 4, 0} → 再赋值 max | 9 |
执行 a = Arrays.copyOf(a, a.length + 1) 后,a 指向了一个全新的数组,原数组被丢弃。a.length 从 8 变为 9。
2. 赋值位置
a[a.length - 1] = max; // 即 a[8] = 342Code language: JavaScript (javascript)
因为新数组长度为 9,最后一个下标是 8,所以最大值放在 a[8]。
3. 遍历输出
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
注意这里从 i = 0 开始遍历,输出所有元素(包括原来的和新增的最大值)。
逻辑拆解
| 步骤 | 说明 |
|---|---|
| 找最大值 | 遍历原数组,用 max 记录最大值 342 |
| 扩容 | Arrays.copyOf(a, 9) 创建新数组,原 8 个元素复制过来,第 9 位默认 0 |
| 放最大值 | a[8] = 342,新数组变为 9 个元素 |
| 输出 | 从下标 0 到 8 依次输出 |
注意:
a = Arrays.copyOf(...)之后,a已经指向新数组,后续所有对a的操作都是针对新数组。原数组因为没有引用指向它,会被垃圾回收。