package org.coding.one; import java.util.Arrays; public class ArrayList implements List { /** * 用于存放数据的数组 */ private Object[] elementData; /** * 记录 ArrayList 中存放元素的个数 */ private int size; /** * ArrayList 的默认的初始容量值 */ private static final int DEFAULT_CAPACITY = 10; public ArrayList() { this.elementData = new Object[DEFAULT_CAPACITY]; } @Override public void add(Object o) { ensureGrow(); this.elementData[size++] = o; } private void grow(int capacity) { this.elementData = Arrays.copyOf(this.elementData, capacity); } @Override public void add(int index, Object o) { checkRangeIndex(index); ensureGrow(); System.arraycopy(this.elementData, index, this.elementData, index + 1, this.size - index); this.elementData[index] = o; this.size ++; } private void ensureGrow() { if(this.size == this.elementData.length) { //扩容 grow(this.size + 1); } } @Override public Object get(int index) { checkGetValIndex(index); return this.elementData[index]; } private void checkGetValIndex(int index) { if(index < 0 || index >= this.size) { //越界 throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); } } private void checkRangeIndex(int index) { if(index < 0 || index > this.size) { //越界 throw new IndexOutOfBoundsException("Index: "+index+", Size: "+ this.size); } } @Override public Object remove(int index) { checkGetValIndex(index); Object oldVal = this.elementData[index]; this.elementData[index] = null; //释放引用 System.arraycopy(this.elementData, index + 1, this.elementData, index, this.size - index -1); this.size--; return oldVal; } @Override public int size() { return this.size; } @Override public boolean isEmpty() { return this.size == 0; } @Override public String toString() { return "ArrayList [elementData=" + Arrays.toString(elementData) + ", size=" + size + "]"; } }