//代码参考自《数据结构与算法分析》 public class ArrayList implements List { private int size; private int capacity; private static final int DEFAULT_CAPACITY = 10; private Object[] elementData; //add()时用于在必要时刻扩充底层数组容量 private void expand() { if (size < capacity) return;//尚未满员,不必扩容 if (capacity < DEFAULT_CAPACITY) capacity = DEFAULT_CAPACITY;//不低于最小容量 Object[] oldElem = elementData; elementData = new Object[capacity <<= 1]; for (int i = 0; i < size; i++) elementData[i] = oldElem[i]; } //remove()时用于在必要时刻缩小底层数组容量 private void shrink() { if (capacity < DEFAULT_CAPACITY << 1) return;//不致收缩至DEFAULT_CAPACITY以下 if (capacity >> 2 < size) return; //以25%为界 Object[] oldElem = elementData; elementData = new Object[capacity >>= 1]; for (int i = 0; i < size; i++) elementData[i] = oldElem[i]; } public ArrayList() { clear(); } public void clear() { size = 0; elementData = new Object[capacity = DEFAULT_CAPACITY]; } public int size() { return size; } public int capacity() { //用于测试shrink()&expand() return capacity; } public boolean isEmpty() { return size == 0; } public void add(Object o){ add(size(), o); } public void add(int index, Object o){ if (index < 0 || size < index) throw new IndexOutOfBoundsException(); expand(); for (int i = size; i > index; i--) elementData[i] = elementData[i - 1]; elementData[index] = o; size++; } public Object get(int index){ if (index < 0 || size <= index) throw new IndexOutOfBoundsException(); return elementData[index]; } public Object remove(int index){ if (index < 0 || size <= index) throw new IndexOutOfBoundsException(); Object removed = elementData[index]; for (int i = index; i < size - 1; i++) elementData[i] = elementData[i + 1]; size--; shrink(); return removed; } public Iterator iterator(){ return new ArrayListIterator(); } private class ArrayListIterator implements Iterator { private int current; public boolean hasNext() { return current != size; } public Object next() { if (!hasNext()) throw new java.util.NoSuchElementException(); return elementData[current++]; } } //以下方法便于测试 public ArrayList(Object ...args) { this(); for (Object o : args) add(o); } public void add(Object ...args) { for (Object o : args) add(o); } public void removeElems(int ...args) { for (int i : args) remove(i); } public static void showElements(ArrayList list) { System.out.print("当前list中元素:"); Iterator iter = list.iterator(); while (iter.hasNext()) System.out.print(iter.next() + " "); System.out.println(); } public static void test(ArrayList list) { System.out.println("--------基本方法测试---------"); System.out.println("当前list.isEmpty(): " + list.isEmpty()); System.out.println("当前list.size(): " + list.size()); System.out.println("当前list.capacity(): " + list.capacity()); showElements(list); } public static void main(String[] args) { ArrayList list = new ArrayList(1, 2, 3, 4, 5); test(list); list.add(6, 7, 8, 9, 10); test(list); list.add(3, 11); list.get(3); test(list); list.remove(3); test(list); list.add(11,12,13,14,15,16,17,18,19,20,21,22,23,24); test(list); list.removeElems(1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); test(list); } }