ArrayList 介绍
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。和Vector不同,ArrayList中的操作不是线程安全的。所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector
ArrayList 源代码分析
构造函数:
//无参构造函数,默认长度为10
public ArrayList(){
this(10);
}
//带参数的构造函数,指定长度
public ArrayList(int i){
if(i < 0){
throw new IllegalArgumentException((new StringBuilder()).append("Illegal Capacity: ").append(i).toString());
} else{
//Arraylist的内部结构就是一个Object数组
elementData = new Object[i];
return;
}
}
其他常用方法:
//是否为empty是看size是否为0
public boolean isEmpty(){
return size == 0;
}
//判断是否包含某个元素
public boolean contains(Object obj){
return indexOf(obj) >= 0;
}
public int indexOf(Object obj){
if(obj == null){//判断元素为null时,包含的元素中如果有为null则为true
for(int i = 0; i < size; i++)
if(elementData[i] == null)
return i;
} else{//判断元素不为null时,用equals方法来判断
for(int j = 0; j < size; j++)
if(obj.equals(elementData[j]))
return j;
}
return -1;
}
//获取元素最后位置,原理同contains
public int lastIndexOf(Object obj){
if(obj == null){
for(int i = size - 1; i >= 0; i--)
if(elementData[i] == null)
return i;
} else{
for(int j = size - 1; j >= 0; j--)
if(obj.equals(elementData[j]))
return j;
}
return -1;
}
//set和get都是简单的操作数组
public Object get(int i){
//数组判断
rangeCheck(i);
return elementData(i);
}
private void rangeCheck(int i){
if(i >= size)//数组越界移除抛出的情况
throw new IndexOutOfBoundsException(outOfBoundsMsg(i));
else
return;
}
public Object set(int i, Object obj){
rangeCheck(i);
Object obj1 = elementData(i);
elementData[i] = obj;
return obj1;
}
......
其他add、set、remove等也都是对数组elementData进行操作,增加、替换、移动位置等。
看了上面的源码,我们就会发现其实Arraylist的实现比较简单,基本就是对一个Object数组的操作。
附:
遍历ArrayList时,使用随机访问(即,通过索引序号访问)效率最高,for循环次之,而使用迭代器的效率最低!