package com.zzl.util; import java.util.Arrays; import java.util.NoSuchElementException; public class ArrayList implements List{ private static final int DEFAULT_SIZE = 4; private int size = 0; private Object[] elementData = new Object[DEFAULT_SIZE]; public void add(Object o){ ensureCapacity(size + 1); elementData[size++] = o; } public void add(int index, Object o){ rangeCheck(index); ensureCapacity(size + 1); System.arraycopy(elementData, index, elementData, index+1, size - index); elementData[index] = o; size++; } public Object get(int index){ rangeCheck(index); return elementData[index]; } public Object remove(int index){ rangeCheck(index); Object oldValue = elementData[index]; int moveNum = size - index - 1; if(moveNum > 0) System.arraycopy(elementData, index+1, elementData, index, moveNum); elementData[--size] = null; return oldValue; } public int size(){ return size; } public Iterator iterator(){ return new ArrayListIterator(); } private void rangeCheck(int index){ if(index > size || index < 0) throw new IndexOutOfBoundsException("Index:" + index + "size:" + size); } private void ensureCapacity(int minCapacity){ if(minCapacity <= DEFAULT_SIZE){ minCapacity = DEFAULT_SIZE; } if(minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity){ int oldSize = elementData.length; int newSize = oldSize + DEFAULT_SIZE; elementData = Arrays.copyOf(elementData, newSize); } private class ArrayListIterator implements Iterator{ int cursor; @Override public boolean hasNext() { return cursor < size; } @Override public Object next() { if (hasNext()){ return elementData[cursor++]; } throw new NoSuchElementException(); } } }