package com.coding.basic; import java.util.Arrays; public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[4]; public void add(Object o) { ensureCapacity(size + 1); elementData[size] = o; size++; } private void ensureCapacity(int minCapacity) { if (minCapacity > elementData.length) { int newCapacity = Math.max(minCapacity, elementData.length * 2); Object[] newArray = new Object[newCapacity]; System.arraycopy(elementData, 0, newArray, 0, elementData.length); elementData = newArray; } } public void add(int index, Object o) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } ensureCapacity(size + 1); // shift and add element System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = o; size++; } public Object get(int index) { // check input if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } return elementData[index]; } public Object remove(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException(); } if (size == 0) { return null; } // remove element and shift Object target = elementData[index]; System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); // reset last element elementData[size - 1] = null; size--; return target; } public int size() { return size; } public Iterator iterator() { return new SeqIterator(); } private class SeqIterator implements Iterator { int i = 0; @Override public boolean hasNext() { return i < size; } @Override public Object next() { if (!hasNext()) { return null; } return elementData[i++]; } } }