ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小
/**
* 字段:数组作为容器,与尺寸
*/
Object[] elementData;
int size;//区分数组中的属性length(容器的容量)
public ArrayListImpl(int initialSize){
if (initialSize < 0){
throw new IllegalArgumentException("LIst容量不够");
}
this.elementData =new Object[initialSize];
}
public ArrayListImpl(){
this(10);//默认调用容量为10的构造方法
}
public boolean add(Object element){
ensureCapacity(size + 1);//至少扩充容量的1个
elementData[size++] = element;
return true;
}
/**
* 确定容量:取max(指定的值minCapacity,1.5倍原来容量+1);并重新赋值
*/
public void ensureCapacity(int minCapacity){//默认是为 size + 1:size指的是其中数据个数
int oldCapacity = elementData.length;//数组的长度
if (oldCapacity < minCapacity){//原来的空间不够了
int newlength = (oldCapacity * 3)/2 + 1;
int newCapacity = Math.max(minCapacity,newlength);
elementData = Arrays.copyOf(elementData,newCapacity);//复制数组
}
}
public boolean add(int index, Object element){
if (index < 0 || index > size ){//如果为空或者已经越界了就抛出异常
throw new ArrayIndexOutOfBoundsException("数组索引错误index:"+ index);
}
ensureCapacity(size);
System.arraycopy(elementData, index, elementData, index + 1,
size - index);//往后偏移一个
elementData[index] = element;
size++;
return true;
}
/**
* 获取元素之前需要检查是否越界等
*/
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
public void rangeCheck(int index){
if (index > size){
throw new ArrayIndexOutOfBoundsException("您查找的元素越界了");
}
}
public Object remove(int index){
rangeCheck(index);
Object oldElement = elementData[index];//临时保存起来
int numMoved = size - index - 1;//长度
if (numMoved > 0){
System.arraycopy(elementData,index+1,elementData,index,numMoved);
}
elementData[--size] =null;//垃圾回收机制开始工作
return oldElement;
}