// ------------------------
// ArrayInitialization.java
// ------------------------

import java.util.Arrays;

interface Array<T> {
    public T    get (int i);
    public void set (int i, T v);}

final class LinearArray<T> implements Array<T> {
    private T[] a;

    /**
     * O(n)
     */
    public LinearArray (int n, T v) {
//      a = new T[n];
        a = (T[]) new Object[n];  // warning: unchecked cast
        Arrays.fill(a, v);}

    /**
     * O(1)
     */
    public T get (int i) {
        return a[i];}

    /**
     * O(1)
     */
    public void set (int i, T v) {
        a[i] = v;}}

final class ConstantArray<T> implements Array<T> {
    private T[]   a;
    private int[] b;
    private int[] c;
    private int   s;
    private T     v;

    /**
     * O(1)
     */
    private boolean check (int i) {
        if ((c[i] < 0) || (c[i] >= s) || (b[c[i]] != i)) {
            b[s] = i;
            c[i] = s;
            ++s;
            return true;}
        return false;}

    /**
     * O(1)
     */
    public ConstantArray (int n, T v) {
//      a      = new T[n];
        a      = (T[]) new Object[n];  // warning: unchecked cast
        b      = new int[n];
        c      = new int[n];
        s      = 0;
        this.v = v;}

    /**
     * O(1)
     */
    public T get (int i) {
        if (check(i))
            a[i] = v;
        return a[i];}

    /**
     * O(1)
     */
    public void set (int i, T v) {
        check(i);
        a[i] = v;}}

final class ArrayInitializationTest {
    public static void main (String[] args) {
        System.out.println("ArrayInitialization.java");

        {
        Array<String> x = new LinearArray<String>(10, "abc");
        assert x.get(2) == "abc";
        x.set(2, "def");
        assert x.get(2) == "def";
        x.set(3, "ghi");
        assert x.get(3) == "ghi";
        }

        {
        Array<String> x = new ConstantArray<String>(10, "abc");
        assert x.get(2) == "abc";
        x.set(2, "def");
        assert x.get(2) == "def";
        x.set(3, "ghi");
        assert x.get(3) == "ghi";
        }

        System.out.println("Done.");}}


syntax highlighted by Code2HTML, v. 0.9.1