JDK源码分析(2)-java.util.LinkedList
2016-10-27 22:51
639 查看
废话少说,直接开搞
LinkedList只保存first与last的引用,每次找某个节点,也是从first或者last开始找,所以比ArrayList效率低。而对某个节点的新增或者删除,LinkedList只需要调整一下节点的指向,比ArrayList快的多!
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快的多!
相关文章推荐
- (8) Java源码分析 ---- LinkedList (对应数据结构中线性表中的双向循环链表,JDK1.6)
- Java Collections Framework之LinkedList源码分析(基于JDK1.6)
- java.util.LinkedList源码分析
- Java -- 基于JDK1.8的LinkedList源码分析
- Java Collections Framework之Deque(LinkedList实现)源码分析(基于JDK1.6)(已补充)
- Java Collections Framework之Queue(LinkedList实现)源码分析(基于JDK1.6)
- java容器源码分析--LinkedList(JDK1.8)
- JDK源码分析之java.util.ArrayList
- LinkedList源码分析(基于JDK1.6)
- Java LinkedList 源码分析
- java.util.List源码分析
- 源码分析:LinkedList和Java中的指针操作
- Java LinkedLIst 源码分析
- Java Collecttions - LinkedList 源码分析
- Java集合:LinkedList使用详解及源码分析
- java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
- Java源码分析之LinkedList
- JDK源码分析——Java.util.Vector的浅析
- java 集合框架之LinkedList及ListIterator实现源码分析
- java源码分析之LinkedList