// 第 3 周 – Java 中的数组基础
// 运行：java ArrayBasics.java
import java.util.Arrays;

public class ArrayBasics {
    public static void main(String[] args) {
        // 创建：大小在创建时确定（静态数据结构）
        int[] a = new int[5];              // 每个元素都是 0（默认值）
        double[] d = new double[3];        // 0.0
        boolean[] b = new boolean[2];      // false
        String[] s = new String[2];        // null
        System.out.println("int[]:     " + Arrays.toString(a));
        System.out.println("double[]:  " + Arrays.toString(d));
        System.out.println("boolean[]: " + Arrays.toString(b));
        System.out.println("String[]:  " + Arrays.toString(s));

        // 带初始值
        int[] primes = { 2, 3, 5, 7, 11 };
        System.out.println("primes.length = " + primes.length);

        // 按下标直接访问 – O(1)
        primes[0] = 1;
        System.out.println("primes[4] = " + primes[4]);

        // 边界检查：运行时错误，而不是悄悄地改写内存（像 C 那样）
        try {
            primes[5] = 13;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Error: " + e.getMessage());
        }

        // 两种遍历方式
        int sum = 0;
        for (int i = 0; i < primes.length; i++) sum += primes[i];
        for (int p : primes) System.out.print(p + " ");
        System.out.println("| sum = " + sum);

        // 复制：赋值不会复制数组，只复制引用！
        int[] alias = primes;
        int[] copy = Arrays.copyOf(primes, primes.length);
        primes[1] = 100;
        System.out.println("alias[1] = " + alias[1] + ", copy[1] = " + copy[1]);

        // 复制到更大的数组中（“扩展”数组的唯一方法）
        int[] bigger = Arrays.copyOf(copy, 8);
        System.out.println("bigger = " + Arrays.toString(bigger));

        // 有用的库函数
        int[] u = { 5, 2, 9, 1 };
        Arrays.sort(u);
        System.out.println("sorted: " + Arrays.toString(u));
        Arrays.fill(a, 7);
        System.out.println("fill(7): " + Arrays.toString(a));
    }
}
