package com.byhieg.coding2017;
import java.util.Arrays;
import java.util.NoSuchElementException;
public class ArrayList implements List {
private int size = 0;
private Object[] elementData = new Object[100];
public void add(Object o) {
isCapacityEnough(size + 1);
elementData[size++] = o;
}
public void add(int index, Object o) {
checkForAdd(index);
isCapacityEnough(size + 1);
System.arraycopy(elementData,index,elementData,index + 1,size - index);
elementData[index] = o;
size++;
}
private void checkForAdd(int index){
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("index不在指定范围内");
}
}
private void isCapacityEnough(int size) {
if (size > 100) {
explicitCapacity(size);
}
if (size < 0) {
throw new OutOfMemoryError();
}
}
private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8;
public void explicitCapacity(int size) {
int newLength = elementData.length * 2;
if (newLength > (MAX_ARRAY_LENGTH)){
newLength = (size > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH);
}
elementData = Arrays.copyOf(elementData, newLength);
}
public Object get(int index) {
checkRange(index);
return elementData[index];
}
private void checkRange(int index){
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index不在范围内");
}
}
public Object remove(int index) {
Object o = get(index);
//要保证后面的 index + 1是有效的
int moveSize = size - index - 1;
if (moveSize > 0) {
System.arraycopy(elementData,index + 1,elementData,index, size - index);
}
elementData[--size] = null;
return o;
}
public int size() {
return size;
}
public Iterator iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator {
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public Object next() {
if (cursor >= size) {
throw new NoSuchElementException();
}
return elementData[cursor++];
}
}
}