ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小
- 两个字段:数组容器与元素的个数size
/**
* 字段:数组作为容器,与尺寸
*/
Object[] elementData;
int size;//区分数组中的属性length(容器的容量)
- 构造方法:(指定元素数组初始化容量 + 一个默认的10个容量大小)
public ArrayListImpl(int initialSize){
if (initialSize < 0){
throw new IllegalArgumentException("LIst容量不够");
}
this.elementData =new Object[initialSize];
}
public ArrayListImpl(){
this(10);//默认调用容量为10的构造方法
}
- 添加元素:之前需要检查容量,调用ensureCapacity,如果不够的话容量大小应该增加
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);//复制数组
}
}
- 指定index进行添加:[ index,后面的 ] 往后移动一个
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;
}
- 获取指定的元素:之前需要检查index时候越界
/**
* 获取元素之前需要检查是否越界等
*/
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;
}