package com.coding.basic; public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[10]; public void add(Object o) { ensureCapacity(size + 1); elementData[size++] = o; } public void add(int index, Object o) { checkForLength(index); ensureCapacity(size + 1); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; size++; } public Object get(int index) { checkForLength(index); return elementData[index]; } public Object remove(int index) { checkForLength(index); Object oldValue = elementData[index]; System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); size--; return oldValue; } public int size() { return size; } public Iterator iterator() { return null; } private void checkForLength(int index) { if (index < 0 || index >= size) { throw new RuntimeException("out of memory"); } } private void ensureCapacity(int minCapacity) { if (minCapacity - elementData.length > 0) { grow(minCapacity); } } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//增大容量 if (newCapacity - minCapacity < 0) { newCapacity = minCapacity; } elementData = copyOf(elementData, newCapacity); } private Object[] copyOf(Object[] src, int newCapacity) { Object[] target = new Object[newCapacity]; System.arraycopy(src, 0, target, 0, src.length); return target; } public static void main(String[] args) { ArrayList list = new ArrayList(); String num = "num"; for (int i = 0; i < 100; i++) { list.add(num + String.valueOf(i)); System.out.println(String.valueOf(i) + ":size:" + list.size()); System.out.println(String.valueOf(i) + ":length:" + list.elementData.length); } System.out.println(list.size()); for (int i = 0; i < 100; i++) { list.add(i, num + String.valueOf(i)); System.out.println(String.valueOf(i) + ":size:" + list.size()); System.out.println(String.valueOf(i) + ":length:" + list.elementData.length); } System.out.println(list.size()); for (int i = 0; i < 200; i++) { System.out.println(list.remove(0)); } System.out.println(list.size()); } }