package list; /** * @author jiaxun */ public class ArrayList implements List { private static final int DEFAULT_CAPACITY = 10; private Object[] elementData; private int size; public ArrayList() { elementData = new Object[DEFAULT_CAPACITY]; size = 0; } public void add(Object object) { ensureCapacity(); elementData[size] = object; size++; } public void add(int index, Object object) { if (index > size || index < 0) { throw new ArrayIndexOutOfBoundsException(); } ensureCapacity(); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = object; size++; } public Object remove(int index) { if (index < 0 || index > size) { return null; } Object object = get(index); System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); size--; return object; } public int size() { return size; } public Object get(int index) { if (index >= size || index < 0) { throw new ArrayIndexOutOfBoundsException(); } return elementData[index]; } public void set(int index, Object object) { if (index >= size) { throw new ArrayIndexOutOfBoundsException(); } elementData[index] = object; } public boolean isEmpty() { return size == 0; } public Iterator iterator() { return new ArrayListIterator(this); } private void ensureCapacity() { if (size + 1 > elementData.length) { ensureCapacity(elementData.length + 1); } } private void ensureCapacity(int length) { Object[] newElementData = new Object[length]; System.arraycopy(elementData, 0, newElementData, 0, size); elementData = newElementData; } private class ArrayListIterator implements Iterator { private ArrayList arrayList; private int currentPosition = 0; private ArrayListIterator(ArrayList arrayList) { this.arrayList = arrayList; } @Override public boolean hasNext() { return currentPosition < size; } @Override public Object next() { return elementData[currentPosition++]; } @Override public Object remove() { return arrayList.remove(--currentPosition); } } }