package rui.study.coding2017.coding.basic;
import java.util.Arrays;
import java.util.NoSuchElementException;
public class ArrayList implements List {
private int size;
private Object[] elementData;
private static Object[] emptyObjects={};
private static int defaultCapacity=10;
public void add(Object o){
ensureCapacity(this.size+1);
elementData[size++]=o;
}
public void add(int index, Object o){
rangeCheckForAdd(index);
if(elementData[index]!=null){
ensureCapacity(this.size+1);
//执行数组拷贝
System.arraycopy(elementData,index,elementData,index+1,size-index);
size++;
}
elementData[index]=o;
}
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
public Object remove(int index){
rangeCheck(index);
Object object=elementData[index];
int numMoved=size-index-1;
//如果是最后一位remove ,无需进行数组拷贝
if(numMoved>0){
System.arraycopy(elementData, index+1, elementData, index,numMoved);
}
elementData[--size]=null;
return object;
}
public int size(){
return this.size;
}
public Iterator iterator(){
return new ArrayListIterator();
}
public ArrayList(){
this.size=0;
this.elementData=emptyObjects;
}
public ArrayList(int size){
this.size=size;
if(size>0){
this.elementData=new Object[size];
}else if(size==0){
this.elementData=emptyObjects;
}else{
throw new IllegalArgumentException("非法容器大小 "+size);
}
}
/**
* 判断索引是否合法
* @param index 索引
*/
private void rangeCheckForAdd(int index) {
if(index>size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为:"+size);
}
/**
* 判断索引是否合法 ,
* @param index 索引
*/
private void rangeCheck(int index) {
if(index>=size||index<0)throw new IndexOutOfBoundsException("索引为"+index+",但是当前数组长度为:"+size);
}
/**
* 确保当前数组能够长度能够容纳新的对象,如果不够,就自行增长
* @param needLength 需要的数组长度
*/
private void ensureCapacity(int needLength) {
if(elementData==emptyObjects){
needLength = Math.max(defaultCapacity, needLength);
}
if(needLength-elementData.length>0){
this.grow(needLength);
}
}
/**
* 数组扩容
* @param needLength 需要的长度
*/
private void grow(int needLength) {
int elementLength=elementData.length;
//扩容1.5倍
int newLength=elementLength+(elementLength>>1);
if(needLength-newLength>0){
newLength=needLength;
}
this.elementData= Arrays.copyOf(this.elementData,newLength);
}
private class ArrayListIterator implements Iterator{
//游标,当前迭代器执行到何处了
private int cursor=0;
@Override
public boolean hasNext() {
return cursor!=size;
}
@Override
public Object next() {
if (cursor >= size)throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
return elementData[cursor++];
}
}
}