package com.coding.basic;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.NoSuchElementException;
public class ArrayList<E> implements List<E> {
private int size = 0;
private Object[] elementData;
//默认容量
private static final int DEFAULT_CAPACITY = 10;
public ArrayList(int capacity){
if(capacity >= 0){
elementData = new Object[capacity];
}else {
throw new IllegalArgumentException("Illegal Capacity: " +
capacity);
}
}
public ArrayList(){
this(DEFAULT_CAPACITY);
}
/**
* 保证集合容量
* @param minCapacity
*/
private void ensureCapacity(int minCapacity){
int oldCapacity = elementData.length;
if(minCapacity > oldCapacity){
//扩容
int newCapacity = oldCapacity + (oldCapacity >> 1) + 1;
if(minCapacity - newCapacity > 0){
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
private void checkIndexRange(int index)
{
if(index >= size || index < 0)
{
throw new IndexOutOfBoundsException("Index out of bounds, index : " + index);
}
}
public void add(E o){
ensureCapacity(size+1);
elementData[size++] = o;
}
public void add(int index, E o){
checkIndexRange(index);//检查下标
ensureCapacity(size+1);//保证数组容量
System.arraycopy(elementData,index,elementData,index + 1,size-index);//数组复制,把index后的元素全部向后移一位
elementData[index] = o;//插入元素值
size++;//元素size加一
}
@Override
public E get(int index) {
checkIndexRange(index);//检查下标
return (E)elementData[index];
}
@Override
public E remove(int index) {
E e = this.get(index);
int numMoved = size - index - 1;
if(numMoved > 0)
{
System.arraycopy(elementData, index+1, elementData, index, numMoved);//数组复制,把index后的元素全部向前移一位
}
elementData[--size] = null;//最后一位赋值为null,size-1
return e;
}
public int size(){
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
public Iterator iterator(){
return new ArrayListIterator();
}
private class ArrayListIterator<E> implements Iterator{
private int endIndex = size - 1;
private int index = 0;
public ArrayListIterator(){
}
@Override
public boolean hasNext() {
return this.index < this.endIndex;
}
@Override
public E next() {
if(!this.hasNext()) {
throw new NoSuchElementException();//没有元素了
} else {
return (E)elementData[this.index++];
}
}
}
}