package lesson01; import java.util.Arrays; import java.util.NoSuchElementException; public class ArrayList<E> implements List<E> { private static final int DEFAULT_CAPACITY = 20; private static final int DEFAULT_INCREMENT = 20; private int size; private Object[] elementData; public ArrayList() { this(DEFAULT_CAPACITY); } public ArrayList(int capacity) { size = 0; elementData = new Object[capacity]; } @Override public boolean add(E e) { ensureCapacity(); elementData[size] = e; size++; return true; } private void ensureCapacity() { if(size == elementData.length){ elementData = Arrays.copyOf(elementData, elementData.length + DEFAULT_INCREMENT); } } @Override public void add(int index, E element) { if(index < 0 || index > size){ throw new IndexOutOfBoundsException("Error index :" + index); } ensureCapacity(); System.arraycopy(element, index, element, index + 1, size - index); elementData[index] = element; size++; } @Override public void clear() { elementData = new Object[elementData.length]; size = 0; } @Override public boolean contains(Object o) { if(o == null){ for(int i = 0; i < size; i++){ if(elementData[i] == null){ return true; } } }else{ for(int i = 0; i < size; i++){ if(o.equals(elementData[i])){ return true; } } } return false; } @Override public int indexOf(Object o) { if(o == null){ for(int i = 0; i < size; i++){ if(elementData[i] == null){ return i; } } }else{ for(int i = 0; i < size; i++){ if(o.equals(elementData[i])){ return i; } } } return -1; } @SuppressWarnings("unchecked") @Override public E get(int index) { checkIndex(index); return (E) elementData[index]; } private void checkIndex(int index) { if(index < 0 || index >= size){ throw new IndexOutOfBoundsException("Illegal index:" + index); } } @SuppressWarnings("unchecked") @Override public E remove(int index) { checkIndex(index); E e = (E) elementData[index]; //此处应注意要判断index是否为elementData最后一个元素的下标,因为在下面的arrayCopy方法中要访问index+1的位置,此时有可能发生数组越界。 if(index == size -1){ size --; }else{ System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); } return e; } @Override public boolean remove(Object o) { int index = indexOf(o); if(index >= 0){ remove(index); return true; }else{ return false; } } @SuppressWarnings("unchecked") @Override public E set(int index, E element) { checkIndex(index); E e = (E)elementData[index]; elementData[index] = element; return e; } @Override public int size() { return size; } @Override public Object[] toArray() { return Arrays.copyOf(elementData, size); } /** * 将ArrayList中全部元素存入一个运行时确定类型的数组中 * @param t * @return */ @SuppressWarnings("unchecked") public <T> T[] toArray(T[] t){ if(t.length < size){ t = (T[]) Arrays.copyOf(elementData, size, t.getClass()); }else{ System.arraycopy(elementData, 0, t, 0, size); } return t; } @Override public Iterator<E> iterator() { return new Iter(); } private final class Iter implements Iterator<E>{ int pos = 0; int lastRet = -1; @Override public boolean hasNext() { return pos < size; } @Override public E next() { if(!hasNext()){ throw new NoSuchElementException(); } lastRet = pos++; return get(lastRet); } @Override public void remove() { if(lastRet < 0){ throw new IllegalStateException(); } ArrayList.this.remove(lastRet); } } }