1、LinkedList简介
(1)LinkedList实现了List接口,底层是一个双向链表。从一个内部私有类Node可以看出。
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;
}
}
(2)实现了List接口,故元素是有序的,可以重复,允许为null。
(3)LinkedList还实现了Deque接口,并提供了一些有关前后结点的操作方法,使得它可以用作堆栈及队列。
(4)由于LinkedList底层的增删方法没有加锁,所以它是线程不安全的。并且在使用迭代器进行遍历时,如果对链表结构发生修改,会抛出 ConcurrentModificationException 异常。
2、LinkedList常用方法
构造方法
(1)无参构造:构造一个空列表
public LinkedList() {
}
(2)带参构造:构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。
public LinkedList(Collection<? extends E> c) {
this();
addAll(c); // 将集合c存入一个Object[]中,再对每个元素进行new Node化并连成链。
}
成员方法
LinkedList有众多成员方法,包括实现增删改查判断等功能,可以参考API。在这里添加几个需要注意的方法。
(1)增:
- a、从尾部增加结点
boolean add(E e)
void addLast(E e)
boolean offer(E e)
boolean offerLast(E e)
- b、从头部增加结点
void add(0, E element)
void addFirst(E e)
boolean offerFirst(E e)
- 作为堆使用时的增:
void push(E e)
- 作为堆使用时的增:
(2)删:
- a、获取并删除头部元素
E remove()
E remove(0)
E removeFirst()
- 作为堆使用时的删除并获取头元素:
E pop()
E poll()
E pollFirst()
- 作为堆使用时的删除并获取头元素:
- b、获取并删除尾巴元素
E remove(list.size()-1)
E removeLast()
- 作为堆使用时的删除并获取尾元素:
E pollLast()
- 作为堆使用时的删除并获取尾元素:
- c、删除所有元素
void clear()
(3)改:
E set(int index, E element)
:将此列表中指定位置的元素替换为指定的元素。
(4)查:
- a、获取头元素
E element()
E get(0)
E getFirst()
- 作为堆时的获取头元素:
E peek()
E peekFirst()
- 作为堆时的获取头元素:
- b、获取尾元素
E get(list.size()-1)
E getLast()
- 作为堆时的获取尾元素:
E peekLast()
- 作为堆时的获取尾元素:
(5)判断:
boolean contains(Object o)
:如果此列表包含指定元素,则返回 true。