package com.coding.basic; import java.util.NoSuchElementException; public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[3]; public void add(Object o) { if (elementData.length == size) { expand(); } elementData[size++] = o; } private void expand() { Object[] newDatas = new Object[size * 3 / 2 + 1]; System.arraycopy(elementData, 0, newDatas, 0, size); elementData = newDatas; System.out.println("expand: from :" + size + " to " + size * 2); } public void add(int index, Object o) { if (index > size || index < 0) { throw new IndexOutOfBoundsException("index=" + index + " , size=" + size); } if (elementData.length == size) { expand(); } Object[] tmps = new Object[size - index]; System.arraycopy(elementData, index, tmps, 0, size - index); elementData[index] = o; System.arraycopy(tmps, 0, elementData, index + 1, size - index); size++; } public Object get(int index) { if (index >= size || index < 0) { throw new IndexOutOfBoundsException("index=" + index + " , size=" + size); } return elementData[index]; } public Object remove(int index) { if (index >= size || index < 0) { throw new IndexOutOfBoundsException("index=" + index + " , size=" + size); } Object rt = elementData[index]; Object[] tmps = new Object[size - index - 1]; System.arraycopy(elementData, index + 1, tmps, 0, size - index - 1); System.arraycopy(tmps, 0, elementData, index, size - index - 1); elementData[--size] = null; return rt; } public int size() { return size; } public Iterator iterator() { return new Iterator(){ int pos =0; @Override public boolean hasNext() { if(pos < size) { return true; } return false; } @Override public Object next() { if(pos < size) { throw new NoSuchElementException(); } return elementData[pos++]; }}; } }