首先,ArraryList和LinkedList都是继承了List接口的容器类,所以他们都拥有LIst接口的基本方法
1.从构造方法上来看
ArrayList
public ArrayList(int initialCapacity) {
if (initialCapacity >0) {
this.elementData =new Object[initialCapacity];
}else if (initialCapacity ==0) {
this.elementData =EMPTY_ELEMENTDATA;
}else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
这里只是列举了常用的构造方法.在实例化过程中需要指定其长度,创建一个同等长度的数组
LinkedList
public LinkedList() {
}
不需要指定长度,没有长度的限制.在LinkedLIst分别有两个Node节点属性 first 和 last用于记录链表的起始和结束
private static class Node {
E item;
Nodenext;
Nodeprev;
Node(Node prev, E element, Node next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
2.从扩容上来看
ArrayList
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity =elementData.length;
int newCapacity = oldCapacity + (oldCapacity >>1);
if (newCapacity - minCapacity <0)
newCapacity = minCapacity;
if (newCapacity -MAX_ARRAY_SIZE >0)
newCapacity =hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
ArrayList扩容的时候是在数组的长度不足时进行扩容,这里的minCapacity指的是最小扩容长度,创建一个新的数组,并将元素租的元素放入新的数组
LinkedList
因为LInkedLIst是基于链表的数据结构,所以不用考虑大小问题,区扩容方式和链表也是一致的
3.从功能上来看
1).上面也提及到了,ArrayLIst是基于动态数组的,LinkedLIst是基于链表的,所以在功能上的区别上也类似与这两种数据结构的差异
2).在插入,增加和删除方面,LinkedList上的优势明显高于ArrayList
3).在查询方面,ArrayList可以直接查询某一位置的元素,而LinkedList需要挨个遍历
ArrayList常用于随机访问元素,LinkedLIst在随机访问方面相对较慢,但是它的特性集较ArrayLIst更大