本文共 4944 字,大约阅读时间需要 16 分钟。
private transient Entry1.7开始,因为不再使用header节点,所以默认构造方法声明也不做,first和last会被默认初始化为null。header = new Entry (null, null, null);private transient int size = 0;.../** Constructs an empty list. */public LinkedList() { header.next = header.previous = header;}
// 这是1.8的代码,1.7的一样transient int size = 0;.../** * Pointer to first node. * Invariant: (first == null && last == null) || (first.prev == null && first.item != null) 这是个固定不变的关系 */transient Node因为给LinkedList指定初始容量没什么实际意义,所以不需要指定初始容量的构造方法。first;/** * Pointer to last node. * Invariant: (first == null && last == null) || (last.next == null && last.item != null) 这是个固定不变的关系 */transient Node last;/** Constructs an empty list. */public LinkedList() {}
// 三个版本都一样,这个没什么好说的public LinkedList(Collection c) { this(); addAll(c);}
// 这是1.8的代码,之前版本逻辑一样Node一个很小的优化,根据下标判断下哪种路径更短,该从头开始还是从尾部开始。因为下标index是从0开始的,所以if (index < (size >> 1))这句是没有问题的,加上等号才有问题。node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; }}
// 下面是jdk1.8的代码,因为没有使用头结点,所以代码比1.6的看起来麻烦些,if判断更多public void add(int index, E element) { checkPositionIndex(index); // 检查下标 if (index == size) // 是在尾部添加 linkLast(element); else // 中间添加,需要寻找当前index处的节点,把新节点添加在它的前面 linkBefore(element, node(index));}void linkLast(E e) { final Nodeadd方法简单画了个图,可以看下。l = last; final Node newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++;}void linkBefore(E e, Node succ) { // assert succ != null; final Node pred = succ.prev; final Node newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; modCount++;}
// 下面是jdk1.8的代码,因为没有使用头结点,所以代码比1.6的看起来麻烦些,if判断更多public E remove(int index) { checkElementIndex(index); return unlink(node(index));}E unlink(Noderemove示意图如下。x) { // assert x != null; final E element = x.item; final Node next = x.next; final Node prev = x.prev; if (prev == null) { // 要删除的是第一个节点 first = next; } else { prev.next = next; x.prev = null; } if (next == null) { // 要删除的是最后一个节点 last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; modCount++; return element;}