package datastructure.basic; public class ArrayList implements List { private int size = 0; private Object[] elementData; public ArrayList() { elementData = new Object[100]; } public ArrayList(int initCapacity) { elementData = new Object[initCapacity]; } public void add(Object o) { autoGrow(); elementData[size()] = o; size++; } public void add(int index, Object o) { autoGrow(); System.arraycopy(elementData, index, elementData, index + 1, size() - index); elementData[index] = o; size++; } public Object get(int index) { checkIndex(index); return elementData[index]; } public Object remove(int index) { checkIndex(index); Object removed = elementData[index]; System.arraycopy(elementData, index + 1, elementData, index, size() - index - 1); size--; return removed; } @Override public int indexOf(Object o) { for (int i = 0; i < size(); ++i) { if (elementData[i] == null ? o == null : elementData[i].equals(o)) { return i; } } return -1; } public int size() { return size; } @Override public boolean isEmpty() { return size() == 0; } public Iterator iterator() { return new Iterator() { int index = -1; @Override public boolean hasNext() { return index + 1 < size(); } @Override public Object next() { index++; return elementData[index]; } }; } private void autoGrow() { if (size >= elementData.length) { Object[] newArray = new Object[nextCapacity()]; System.arraycopy(elementData, 0, newArray, 0, elementData.length); elementData = newArray; } } private int nextCapacity() { return elementData.length * 2; } private void checkIndex(int index) { if (index >= size() || index < 0) { throw new IndexOutOfBoundsException(indexOutOfBoundMessage(index)); } } private String indexOutOfBoundMessage(int index) { return "index: " + index + ", size: " + size(); } }