package basic; import java.util.Arrays; /** java泛型: ? 表示不确定的java类型。 T 表示java类型。 K V 分别代表java键值中的Key Value。 E 代表Element。 * 自己实现的ArrayList * Created by zhouliang on 2017-03-10. */ class ArrayList<E> implements List<E> { private Object[] elementData; private int size; public ArrayList(int size){ this.elementData = new Object[size]; } //默认大小为10 public ArrayList(){ this.elementData = new Object[10]; } //判断是否需要扩展容量 ((旧容量 * 3) / 2) + 1 private void checkcapacity(int index){ if(index>elementData.length){ int length = (elementData.length*3)/2+1; /* Object[] temp = new Object[length]; for(int i=0; i<elementData.length; i++){ temp[i] = elementData[i]; } elementData = temp; */ elementData = Arrays.copyOf(elementData,length); } } @SuppressWarnings("unchecked") private E elementData(int index){ return (E) elementData[index]; } @Override public void add(E e) { //确保elementData的长度是否足够大 checkcapacity(size+1); elementData[size]=e; size++; } @Override public void add(int index, E e) { checkPositionIndex(index); //确保elementData的长度是否足够大 checkcapacity(size+1); elementData[index] = e; } @Override public E get(int index) { checkElementIndex(index); return elementData(index); } @Override public E remove(int index) { checkElementIndex(index); E e = elementData(index); //如果是最后一个元素直接去掉 if(index == size-1){ elementData[index] = null; }else{ for(int i=index; i<size; i++){ elementData[i]=elementData[i+1]; } } size--; return e; } @Override public int size() { return size; } private void checkElementIndex(int index) { if (!isElementIndex(index)) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } private boolean isElementIndex(int index) { return index >= 0 && index < size; } private void checkPositionIndex(int index) { if (!isPositionIndex(index)) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } } private boolean isPositionIndex(int index) { return index >= 0 && index <= size; } public Iterator iterator() { return new ArrayListIterator(this); } private class ArrayListIterator implements Iterator { private ArrayList<E> list = null; private int position = 0; private ArrayListIterator(ArrayList<E> list) { this.list = list; } @Override public boolean hasNext() { if ((position + 1) > size()) { return false; } return true; } @Override public E next() { return list.get(position++); } } }