java中LinkList集合也是使用双向链表实现,并提供了增删改查等操作
1、底层使用了双向链表
源码中add()方法调用了linkLast()方法,它将新节点放在之前的last后面,并变成新的last,不过要注意,它有一个属性first,不是我们平常定义的头结点(head),而是head的下一个结点,是会存储数据的
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
2、结点类有三个域(prev,item,next)
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
ArrayList的查询操作是O(1)复杂度,因此当查询操作多时考虑顺序表
LinkedList的查询操作需要从头往后找,为O(n)复杂度,而插入和删除操作为O(n),与ArrayList一样,但LinkList为双向链表,物理地址不是连续的,不需要预先指定存储空间大小,也不需要扩容操作,也不存在元素交换操作,所以当增删操作多时,考虑链表