这里写自定义目录标题
1. 他们的底层结构不同
ArrayList 底层是基于数组实现的,ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
- LinkedList 底层是基于链表实现的,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
- 正因为底层数据结构的不同,他们适用的场景不同,ArrayList 更适合随机查找,LinkedList 更适合删除和添加,查询、添加、删除的时间复杂度不同。
2. ArrayList 和 LinkedList 都实现了 List 接口
但是LinkedList还额外实现了Deque接口,正因为 LinkedList 实现了 Deque 接口,所以LinkedList 还可以当作队列来使用。
ArrayList 继承 AbstractList 类,实现 List 等接口
LinkedList 继承 AbstractSequentialList 类,实现 List 和 Deque 等接口
3. 查询的对比
- 指定下标进行查询,ArrayList 优于 LinkedList 。
是由于底层数据结构的原因,数组是提前分配好内存空间的。
对于链表来说,指定下标来查询,是需要遍历链表。
3.1 ArrayList 类中的查询
ArrayList 类中的 get() 方法
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
3.2 LinkedList 类中的查询
LinkedList 类中的 get() 方法 和 node() 方法
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
/**
* Returns the (non-null) Node at the specified element index.
*/
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x