package com.coding.basic; import java.util.Arrays; /** * A Simple ArrayList */ public class ArrayList<E> implements List<E> { /** * 当前list的元素个数 */ private int size; /** * 默认数组大小 */ private static final int DEFAULT_CAPACITY = 10; /** * 存储元素的数组 */ private Object[] elementData; /** * 追加一个元素 * * @param e */ public void add(E e) { grow(); elementData[size++] = e; } private void grow() { if (elementData.length == size) { elementData = Arrays.copyOf(elementData, size + 10); } } /** * 插入一个元素到指定位置 * * @param index * @param e */ public void add(int index, E e) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException("下标越界"); } grow(); int movedNum = size - index; if (movedNum > 0) { System.arraycopy(elementData, index, elementData, index + 1, movedNum); } elementData[index] = e; size++; } /** * 获取指定位置的元素 * * @param index * @return */ public E get(int index) { checkIndex(index); return getElement(index); } /** * 删除指定位置的元素 * * @param index * @return */ public E remove(int index) { checkIndex(index); E delEle = getElement(index); int movedNum = size - index - 1;//是不是最后一个元素 if (movedNum > 0) { System.arraycopy(elementData, index + 1, elementData, index, movedNum); } elementData[--size] = null; return delEle; } private void checkIndex(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("下标越界"); } } private E getElement(int index) { return (E) elementData[index]; } /** * list中元素的个数 * * @return */ public int size() { return this.size; } public ArrayList() { this.elementData = new Object[DEFAULT_CAPACITY]; } public Iterator<E> iterator() { return new ArrayListIterator(); } private class ArrayListIterator<E> implements Iterator<E> { private int cursor;//游标 private int lastRet = -1;//可被删除元素下标 @Override public boolean hasNext() { return cursor != size; } @Override public E next() { int i = cursor; cursor++; return (E) elementData[lastRet = i]; } @Override public void remove() { if (lastRet < 0) { throw new IllegalStateException(); } cursor = lastRet;//游标等于当前删除元素的下标 或者 cursor--; ArrayList.this.remove(lastRet); lastRet = -1;//重置可删元素下标 } } }