您的位置:首页 > 编程语言 > Java开发

JDK源码分析(2)-java.util.LinkedList

2016-10-27 22:51 639 查看
废话少说,直接开搞

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
//元素个数
transient int size = 0;
//抽象出来的链表节点类
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;
}
}
//第一个元素
transient Node<E> first;
//最后一个元素
transient Node<E> last;
//空的构造函数
public LinkedList() {
}
//带参数的构造函数
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
//将元素置为第一个节点
private void linkFirst(E e) {
//定义一个指向first的节点
final Node<E> f = first;
//新建一个节点为first节点的前驱
final Node<E> newNode = new Node<>(null, e, f);
//将first节点指向这个新的节点
first = newNode;
//如果原first节点为空,则last节点也是新的节点,否则就将原节点的前驱指向新节点
if (f == null)
last = newNode;
else
f.prev = newNode;
//变大
size++;
//fast-fail
modCount++;
}
//将元素置为最后一个节点
//思路和上面一样就是继续在后面接一个节点,如果之前没有元素就将first和last都指向他
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++;
}
//将某个元素链接到某节点前
void linkBefore(E e, Node<E> succ) {
// 拿出该节点的前一个节点并将前一个节点的前驱指向该元素
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
//解除first节点
private E unlinkFirst(Node<E> f) {
// 确定f为first节点,且不为空
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
//将first指向下一个接蒂娜
first = next;
//如果下一个元素为空则最后一个元素也为空
if (next == null)
last = null;
else
//将原下一个的前驱置null
next.prev = null;
size--;
modCount++;
return element;
}
//解除最后一个节点
private E unlinkLast(Node<E> l) {
// assert l == last && l != null;
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l.prev = null; // help GC
last = prev;
if (prev == null)
first = null;
else
prev.next = null;
size--;
modCount++;
return element;
}


总结

其实弄清楚LinkedList的数据结构就能很直观的明白LinkedList和ArrayList的区别了。

LinkedList只保存first与last的引用,每次找某个节点,也是从first或者last开始找,所以比ArrayList效率低。而对某个节点的新增或者删除,LinkedList只需要调整一下节点的指向,比ArrayList快的多!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 linkedlist jdk 源码