🎯 本章你会学到:for / for-each / switch 表达式,以及带边界检查的数组。建议边读边敲,每节练习先自己做,再展开答案对照。
Java 的流程控制和 C 几乎一样,但有三个现代写法值得直接用起来:for-each、switch 表达式、Arrays 工具类。
数组:带长度,且会检查越界
数组求和与最值
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n]; // 动态确定长度;元素自动初始化为 0
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int sum = 0;
int max = a[0];
for (int v : a) { // for-each:只读遍历最省事
sum += v;
if (v > max) {
max = v;
}
}
System.out.println("length=" + a.length);
System.out.println("sum=" + sum);
System.out.println("max=" + max);
}
}输入
5
3 9 4 9 2运行结果
length=5
sum=27
max=9
和 C 最大的区别:a.length 能拿到长度,而且 a[5] 越界时会立刻抛 ArrayIndexOutOfBoundsException,不会像 C 那样悄悄改到别人的内存。
switch 表达式与 Arrays 工具
switch 表达式与 Arrays
import java.util.Arrays;
public class Main {
static String grade(int score) {
return switch (score / 10) { // switch 表达式(Java 14+)
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
default -> "D";
};
}
public static void main(String[] args) {
int[] scores = {95, 82, 71, 60};
for (int s : scores) {
System.out.print(grade(s));
}
System.out.println();
String[] names = {"Cid", "Ann", "Bob"};
Arrays.sort(names); // 原地排序
System.out.println(Arrays.toString(names)); // 打印数组内容
}
}运行结果
ABCD
[Ann, Bob, Cid]
| 写法 | 作用 | 备注 |
|---|---|---|
| for (int v : a) | 遍历元素 | 想改元素要按下标循环 |
| Arrays.sort(a) | 升序排序 | 对象数组要传 Comparator |
| Arrays.toString(a) | 打印数组 | 直接 println 数组只会打印地址 |
| System.arraycopy / Arrays.copyOf | 复制数组 | 赋值 a = b 只是复制引用 |
| switch 表达式 -> | 返回值式分支 | 不需要 break,也不会贯穿 |
⚠️ 易错点
System.out.println(a) 打印的是 [I@1b6d3586 这种地址,要打印内容用 Arrays.toString(a)。⚠️ 易错点 数组赋值
int[] b = a; 只是让两个变量指向同一个数组,改 b[0] 会连带改到 a[0];要独立副本用 Arrays.copyOf(a, a.length)。✍️ 本节练习
3.1必做数组反转输出
读入 n 个整数,按相反顺序输出,数字之间用空格分隔。
输入 第一行 n;第二行 n 个整数。
输出 一行:反转后的序列。
样例输入
5
1 2 3 4 5样例输出
5 4 3 2 1💡 提示 从 n - 1 倒着循环;最后一个数字后面不要多余空格。
✅ 查看参考答案与解析
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
StringBuilder sb = new StringBuilder();
for (int i = n - 1; i >= 0; i--) {
if (sb.length() > 0) {
sb.append(' ');
}
sb.append(a[i]);
}
System.out.println(sb);
}
}解析 用 StringBuilder 拼接并用 length 判断分隔符,是 Java 里避免“末尾多一个空格”的标准写法。
3.2挑战统计偶数与平均值
读入 n 个整数,输出其中偶数的个数和所有数的平均值(保留 2 位小数)。
输入 第一行 n;第二行 n 个整数。
输出 两行:evens=个数、avg=平均值。
样例输入
6
1 2 3 4 5 6样例输出
evens=3
avg=3.50💡 提示 判断偶数用 v % 2 == 0;平均值要转 double:sum / (double) n。
✅ 查看参考答案与解析
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int evens = 0;
long sum = 0;
for (int i = 0; i < n; i++) {
int v = sc.nextInt();
sum += v;
if (v % 2 == 0) {
evens++;
}
}
System.out.println("evens=" + evens);
System.out.printf("avg=%.2f%n", sum / (double) n);
}
}解析 整数相除会截断,必须写成 sum / (double) n(或 1.0 * sum / n)。
📚 本文概念都在知识大全:
JVM 与字节码 · JDK · String 与 StringBuilder · 集合框架 · 泛型 · 受检异常 · 继承与接口 · record · Stream API