package com.aaront.exercise.basic;
import java.util.Arrays;
public class ArrayList implements List {
private int size = 0;
private static final double factor = 0.75;
private Object[] elementData = new Object[100];
public void add(Object o) {
_ensureCapacityEnough();
elementData[size++] = o;
}
public void add(int index, Object o) {
if (index < 0 || index > size) throw new IndexOutOfBoundsException("index超出边界");
_ensureCapacityEnough();
int i = size;
for (; i > index; i--) {
elementData[i] = elementData[i - 1];
}
elementData[i] = o;
size++;
}
private void _ensureCapacityEnough() {
if (size >= elementData.length) {
dilatancy();
}
}
private void dilatancy() {
int newLength = elementData.length + (int) (elementData.length * factor);
elementData = Arrays.copyOf(elementData, newLength);
}
public Object get(int index) {
if(index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界");
return elementData[index];
}
public Object remove(int index) {
if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index超出边界");
Object element = elementData[index];
System.arraycopy(elementData, index + 1, elementData, index, size - 1 - index);
size--;
return element;
}
public int size() {
return size;
}
public Iterator iterator() {
return new ArrayListIterator(this);
}
public Object[] toArray() {
Object[] objects = new Object[size];
System.arraycopy(elementData, 0, objects, 0, size);
return objects;
}
private static class ArrayListIterator implements Iterator {
private ArrayList arrayList;
private int pos = 0;
private ArrayListIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
public boolean hasNext() {
return pos < arrayList.size();
}
public Object next() {
return arrayList.elementData[pos++];
}
public void remove() {
arrayList.remove(pos - 1);
pos--;
}
}
}