package com.coding.basic;
import java.util.Arrays;
import java.util.NoSuchElementException;
/**
* Created by huitailang on 17/2/25.
*
* @author zhangkun
* @date 2017年02月25日13:23:30
*/
public class ArrayList implements List {
private int size = 0;
private static final int DEFAULT_SIZE = 16;
private Object[] elementData = null;
private int index;
public ArrayList() {
elementData = new Object[DEFAULT_SIZE];
}
public ArrayList(final int size) {
elementData = new Object[size];
}
public void add(Object o) {
//如果当前元素个数大于数组长度的2/3
if (size() > elementData.length * 2 / 3) {
raiseArray();
}
elementData[index++] = o;
size++;
}
public void add(int index, Object o) {
checkParam(index);
//如果当前元素个数大于数组长度的2/3
if (size() > elementData.length * 2 / 3) {
raiseArray();
}
elementData[index] = o;
size++;
}
public Object get(int index) {
checkParam(index);
return elementData[index];
}
public Object remove(int index) {
checkParam(index);
Object o = elementData[index];
elementData[index] = null;
size--;
return o;
}
private void raiseArray() {
Object[] newElementData = Arrays.copyOf(elementData, size() * 2);
elementData = newElementData;
}
private void checkParam(int index) {
if (index < 0 || index > elementData.length - 1) {
throw new IndexOutOfBoundsException();
}
}
public int size() {
return size;
}
public Iterator iterator() {
return new ListIterator();
}
private class ListIterator implements Iterator{
int cursor;
@Override
public boolean hasNext() {
return cursor != size;
}
public void remove(){
throw new UnsupportedOperationException();
}
@Override
public Object next() {
if(!hasNext()) {
throw new NoSuchElementException();
}
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1;
return elementData[i];
}
}
}