package basic; import java.util.Arrays; public class ArrayList implements List{ private int size; private Object[] elementData = {}; public ArrayList(){ this(16); } public ArrayList(int capacity){ if(capacity > 0){ elementData = new Object[capacity]; }else if(capacity == 0){ }else{ throw new IllegalArgumentException("initsize:"+capacity); } } @Override public void add(Object o) { ensureCapacity(elementData.length + 1); elementData[size++] = o; } @Override public void add(int index, Object o) { checkIndex(index); ensureCapacity(size + 1); System.arraycopy(elementData, index, elementData, index+1, size - index); elementData[index] = o; size++; } @Override public Object get(int index) { checkIndex(index + 1); return elementData[index]; } @Override public Object remove(int index) { checkIndex(index + 1); Object removeparam = elementData[index]; int numMoved = size - index - 1; if(numMoved > 0){ System.arraycopy(elementData, index+1, elementData, index, numMoved); } elementData[--size] = null; //置空末尾元素 return removeparam; } @Override public int size() { return size; } /** * 检查是否越界 * @param index */ public void checkIndex(int index){ if(index > size || index < 0){ throw new IndexOutOfBoundsException("current:"+index+" size:"+size); } } /** * 判断当前容量是否足够 * @param minCapacity */ private void ensureCapacity(int minCapacity){ if(minCapacity > elementData.length){ grow(minCapacity); } } /** * 扩容 * @param minCapacity */ private void grow(int minCapacity){ Object [] target = new Object [minCapacity+10]; System.arraycopy(elementData, 0, target, 0, elementData.length); elementData = target; } public Iterator iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator{ private int current = 0; @Override public boolean hasNext() { return current < size; } @Override public Object next() { int i = current; if(current >= size){ throw new IndexOutOfBoundsException("current:"+current+" size:"+size); } current++; return elementData[i]; } } @Override public String toString() { return Arrays.toString(Arrays.copyOf(elementData, size)); } }