import java.util.Arrays;

public class MyArrayList
{
    private Object[] elementData;
    private int size;

    public MyArrayList(int startKapazitaet)
    {
        if (startKapazitaet <= 0)
            throw new IllegalArgumentException
            ("Ungueltige Startkapazitaet: " + startKapazitaet);

        elementData = new Object[startKapazitaet];
        size = 0;
    }

    public MyArrayList()
    {
        this(10);
    }

    public int size()
    {
        return size;
    }

    public int capacity()
    {
        return elementData.length;
    }

    public void add(Object element)
    {
        if (element == null)
            throw new IllegalArgumentException("Element ist null.");

        if (element instanceof Integer || 
            element instanceof Double  ||
            element instanceof Boolean)
            throw new IllegalArgumentException
            ("int-, double- oder boolean-Werte sind nicht erlaubt.");

        if (size >= elementData.length)
            grow();

        elementData[size] = element;
        size++;
    }

    public void add(int index, Object element)
    // Neu in Version 2.3
    {
        if (element == null)
            throw new NullPointerException("element ist null.");

        if (element instanceof Integer || 
            element instanceof Double  ||
            element instanceof Boolean)
            throw new IllegalArgumentException
            ("int-, double- oder boolean-Werte sind nicht erlaubt.");   

        if (index < 0 || index > size)
            throw new IndexOutOfBoundsException("index ausserhalb: " + index);

        if (size >= elementData.length)
            grow();

        for (int i = size; i > index; i--)
            elementData[i] = elementData[i - 1];

        elementData[index] = element;
        size++;
    }    

    private void grow()
    {
        int alteKapazitaet = elementData.length;
        int neueKapazitaet = alteKapazitaet + alteKapazitaet / 2;  

        if (neueKapazitaet == alteKapazitaet)
            neueKapazitaet = alteKapazitaet + 1;

        elementData = Arrays.copyOf(elementData, neueKapazitaet);
    }    
}