package com.coding.basic; public class ArrayList implements List { // size不仅是ArrayList中实际存值得体现,直接add时,也是在elementData[size]处进行 private int size = 0; // 数组是连续且有序的 private Object[] elementData; private void resize(int newSize) { Object[] newArray = new Object[newSize]; System.arraycopy(elementData, 0, newArray, 0, size); elementData = newArray; } public ArrayList() { elementData = new Object[10]; } // 添加指定元素至列表尾 public void add(Object o) { if (size == elementData.length) { resize(size * 2); } elementData[size++] = o; } // 将指定元素插入列表中的指定位置。移动当前位置的元素(如果有的话)和右边的后续元素(向索引添加一个元素) public void add(int index, Object o) { rangeCheck(index); if (size == elementData.length / 4) { resize(elementData.length / 2); } System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; size++; } /* * 获取指定位置元素 * (non-Javadoc) * @see com.coding.basic.List#get(int) */ public Object get(int index) { rangeCheck(index); return elementData[index]; } /* * 删除指定位置元素 * (non-Javadoc) * @see com.coding.basic.List#remove(int) */ public Object remove(int index) { rangeCheck(index); Object oldValue = elementData[index]; System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); size--; return oldValue; } public int size() { return this.size; } public Iterator iterator() { return new ArrayListIterator(); } // 检测索引值,当前有size个元素,占了elementData[0]至elementData[size-1],add时,只能在已有[0,size-1]处插入,或者在列表尾size处add // 所以index在[0,size之间] private void rangeCheck(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(); } } class ArrayListIterator implements Iterator { int i = 0; @Override public boolean hasNext() { return i < size; } @Override public Object next() { return elementData[i++]; } } }