public class ArrayList implements List{ private Object[] elements; private static final int INITIAL_SIZE = 16; public static final int MAX_LIST_SIZE = 48; private int size = 0; private int capacity = 0; public ArrayList() { elements = new Object[INITIAL_SIZE]; capacity = INITIAL_SIZE; } public void add(int index, Object obj) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(); } ensureSpace(); if (index == size) { add(obj); } else { System.arraycopy(elements, index, elements, index + 1, size - index); elements[index] = obj; size++; } } public void add(Object obj) { ensureSpace(); elements[size++] = obj; } public int size() { return size; } @Override public String toString() { StringBuilder builder = new StringBuilder("List: [ "); for (int i = 0; i < size; ++ i) { builder.append(elements[i]).append(" "); } builder.append("]"); return builder.toString(); } private void ensureSpace() { if (size == capacity) { if (size == MAX_LIST_SIZE) { throw new IndexOutOfBoundsException(); } int newCapacity = capacity*2 > MAX_LIST_SIZE ? MAX_LIST_SIZE : capacity*2; grow(newCapacity); } } private void grow(int newLength) { Object[] newElements = new Object[newLength]; System.arraycopy(elements, 0, newElements, 0, elements.length); elements = newElements; capacity = newLength; } public Object get(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException(); } return elements[index]; } public Object remove(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException(); } Object toRemove = elements[index]; System.arraycopy(elements, index + 1, elements, index, size - index -1); --size; return toRemove; } public Iterator iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator{ private int pos = 0; public boolean hasNext() { return pos < size(); } public Object next() { return elements[pos++]; } } }