← Java 学习路线(共 8 章)

第 3 章 流程控制与数组

red wenzi · 2026-09-15 · 编程语言 · Java · 📖 预计阅读 12 分钟 · 共 2 道练习
🎯 本章你会学到:for / for-each / switch 表达式,以及带边界检查的数组。建议边读边敲,每节练习先自己做,再展开答案对照。

Java 的流程控制和 C 几乎一样,但有三个现代写法值得直接用起来:for-eachswitch 表达式、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