1.基于的底层数据结构不同(主要)
ArrayList基于数组,而LinkedList基于链表。
2.使用场景不同
由于基于的底层数据不同,所以使用场景不同。ArrayList有数组特性,所以适合随机访问;LinkedList有链表特性,所以适合增加、删除元素。
//ArrayList的get方法
public E get(int index) {
Objects.checkIndex(index, size);
return elementData(index);
}
E elementData(int index) {
return (E) elementData[index];
}
transient Object[] elementData;
ArrayList源码中就是用Object[ ]来存储数据。
//LinkedList的get方法
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
可以看到LinkedList通过index访问元素需要遍历。
ArrayList的添加如果需要扩容则效率降低。
3.接口
ArrayList和LinkedList都实现了List的接口,但LinkedList实现了Deque接口,可以当做双端队列使用。
/**
* Pointer to first node.
*/
transient Node<E> first;
/**
* Pointer to last node.
*/
transient Node<E> last;