package com.coding.basic;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
public void add(Object o) {
int len = size + 1;
if (len == elementData.length) {
expandArray();
}
elementData[size++] = o;
}
public void add(int index, Object o) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
int remain = elementData.length - size;
if (remain == 0 || index == elementData.length) {
expandArray();
}
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = o;
size++;
}
private void expandArray() {
int len = elementData.length;
Object[] temp = new Object[len * 2];
System.arraycopy(elementData, 0, temp, 0, len);
elementData = temp;
}
public Object get(int index) {
if (index < 0) {
throw new IndexOutOfBoundsException();
}
return elementData[index];
}
public Object remove(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
Object removed = elementData[index];
int len = size - index - 1;
if (len > 0) {
System.arraycopy(elementData, index + 1, elementData, index, len);
}
elementData[--size] = null;
return removed;
}
public int size() {
return size;
}
public Iterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator {
private int cursor;
public boolean hasNext() {
return cursor + 1 < size;
}
public Object next() {
return elementData[++cursor];
}
}
}