package com.coding.basic;
import java.util.Arrays;
public class ArrayList implements List {
//数组初始容量//
private final int DEFAULT_CAPICITY=7;
//数组元素个数//
private int size = 0;
private Object[] elementData = new Object[DEFAULT_CAPICITY];
public void add(Object o){
ensureCapcity(size+1);
elementData[size++]=o;
}
public void add(int index, Object o){
//index要连续的增加//
checkIndex(index);
ensureCapcity(size+1);
/* index及后面的元素左移一位,即从index开始移动,注意index从0开始,
* 即还要+1,则长度为size-((index)+1)+1
*/
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index]=o;
size++;
}
public Object get(int index){
checkIndex(index);
return elementData[index];
}
public Object remove(int index){
checkIndex(index);
Object temp=elementData[index];
/* index后面的元素左移一位,即从index+1开始移动,注意index从0开始,
* 即还要+1,则长度为size-((index+1)+1)+1
*/
System.arraycopy(elementData, index+1, elementData, index, size-index-1);
size--;
return temp;
}
public int size(){
return size;
}
public Iterator iterator(){
return new Iterator();
}
private class Iterator{
private int index=0;
public boolean hasNext(){
return index<size;
}
public Object next(){
checkIndex(index);
return elementData[index++];
}
}
//判断请求的下标是否越界并提示//
private void checkIndex(int index){
if (index<0 || index >=size){
throw new IndexOutOfBoundsException("get " + index+" in "+size);
}
}
//判断是否需要扩容并完成扩容//
private void ensureCapcity(int size){
int oldLength=elementData.length;
if (size>=oldLength){
//util.ArrayList中的公式,源代码使用的右移1,即除2//
int newLength=oldLength/2+oldLength;
if (newLength<size){
newLength=size;
}
//Arrays.copyOf返回新的指定长度的数组//
elementData=Arrays.copyOf(elementData, newLength);
}
}
@Override
public String toString(){
//方便检查重写了toString//
StringBuilder sb = new StringBuilder("[");
for (int i=0 ;i<size-1;i++){
sb.append(elementData[i]+",");
}
sb.append(elementData[size-1]);
sb.append("]");
return sb.toString();
}
}