ArrayList
ArrayList是什么?简单来说是一个处理变长数组的列表,这个类的成员变量是一个Object类,和一个表示数组元素个数的size,如下图
它有三个构造方法,这里只介绍一个常见的,源代码如下:
public ArrayList(int initialCapacity) {//初始容量(长度)
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {//当长度为0时,将一个已经初始化好长度为0的数组 EMPTY_ELEMENTDATA赋值给elementData
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
ArrayList也有一些列表的基本方法,如:add() , clear() , contains() ,get() ,indexOf() ,isEmpty() ,remove() , ,set() 等。我自己也实现这些方法,部分如下:
boolean add(E e)
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
ensureCapacityInternal(size + 1); // 此方法是为了保证此列表有足够的容量,当size+1大于此列表的容量时,会对此列表扩容,有兴趣的朋友可以去看看这个方法源代码。
E remove(int index)
public E remove(int index){
rangeCheck(index);
for(int i=index;i<size-1;i++)
elementData[i] = elementData[i+1];//找到对应下标的元素,将其后的元素往前移
size--;
return (E) elementData[index];//将Object强转为E
}
int remove(Object o)
public boolean remove(Object o){
if(o == null)
{
for(int i=0;i<size;i++)
if(elementData[i] == null)
{
remove(i);return true;//找到对应下标的元素,调用remove()方法
}
}
else
{
for(int i=0;i<size;i++)
if(o.equals(elementData[i]))
{
remove(i);return true;//找到对应下标的元素,调用remove()方法
}
}
return false;
}
E set(int index,E element)
public E set(int index, E element) {
rangeCheck(index);
elementData[index] = element;
return (E)elementData[index];//将object类型强转为E类型
}
ArrayList与LinkedList的区别
LinkedList可以被看成一个双向链表,它是由若干个Node节点组成的,而ArrayList是由若干个数组存储任意对象。LinkedList与它最大区别是:LinkedList删减数据更加灵活,效率更高,缺点是查询速度慢,而这却是ArrayList优点