// Week 3 – Array basics in Java
// Run: java ArrayBasics.java
import java.util.Arrays;

public class ArrayBasics {
    public static void main(String[] args) {
        // Creation: the size is fixed at creation (static data structure)
        int[] a = new int[5];              // every element is 0 (default value)
        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));

        // With initial values
        int[] primes = { 2, 3, 5, 7, 11 };
        System.out.println("primes.length = " + primes.length);

        // Direct access by index – O(1)
        primes[0] = 1;
        System.out.println("primes[4] = " + primes[4]);

        // Bounds checking: a run-time error, not a silent memory overwrite (as in C)
        try {
            primes[5] = 13;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Error: " + e.getMessage());
        }

        // Two ways of traversal
        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);

        // Copying: assignment does NOT copy, only the reference!
        int[] alias = primes;
        int[] copy = Arrays.copyOf(primes, primes.length);
        primes[1] = 100;
        System.out.println("alias[1] = " + alias[1] + ", copy[1] = " + copy[1]);

        // Copying into a larger array (the only way to "extend" it)
        int[] bigger = Arrays.copyOf(copy, 8);
        System.out.println("bigger = " + Arrays.toString(bigger));

        // Useful library functions
        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));
    }
}
