LinkedList集合源码解析
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
......
}
LinkedList是基于双向链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。
LinkedList同样是非线程安全的,只在单线程下适合使用。
LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆。
/ 双向链表的节点所对应的数据结构。
// 包含3部分:上一节点,下一节点,当前节点值。
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;
}
}
/**
* 把e作为头节点
*/
private void linkFirst(E e) {
final Node<E> f = first;
final Node<E> newNode = new Node<>(null, e, f);
first = newNode;
if (f == null)
last = newNode;
else
f.prev = newNode;
size++;
modCount++;
}
/**
* 把e做为尾节点
*/
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++;
}
可以看出在1.7中LinkList是双向链表,但不是循环链表(这是在1.6上的变化)
- 不是循环链表,有以下好处
- first / last有更清晰的链头、链尾概念,代码看起来更容易明白。
- first / last方式能节省new一个headerEntry。(实例化headerEntry是为了让后面的方法更加统一,否则会多很多header的空校验)
- 在链头/尾进行插入/删除操作,first /last方式更加快捷。
在查找和删除某元素时,源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null
LinkedList是基于链表实现的,因此不存在容量不足的问题,所以这里没有扩容的方法
LinkedList同样也实现了ListIterator,可以在迭代过程中进行修改
反向迭代器descendingIterator
LinkedList list=new LinkedList();
list.add(1);
list.add(2);
list.add(3);
//System.out.println(list.getLast());
Iterator it=list.descendingIterator();
while (it.hasNext()){
System.out.println(it.next());
}
//输出:3,2,1