【源码解析】Java8-LinkList
LinkedList源码分析
从创建开始说:
1
List linkList = new LinkedList();
1
2/** * Constructs an empty list. */
public LinkedList() {}构建函数里面啥都没操作,然后看一下LinkedList的成员变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
transient int size = 0;
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
}有Node类型的fist和last,first一直指向第一个Node的引用,last一直是最后一个Node的引用,size是这个list的大小,点开Node,看一下是什么东西
1
2
3
4
5
6
7
8
9
10
11private 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;
}
}一个内部静态私有类,其中包括三个元素,一个泛型的item即此节点值,还有一个指向前面和后面的Node,下面看一下add怎么操作的吧
新增一个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18linkList.add("a");
public boolean add(E e) {
linkLast(e);
return true;
}
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++;
}可以看到调用的linkLast方法:
- 先把最后一个元素(即当前元素)赋值给l,此时l为当前元素的引用,为空说明为第一个元素
- new一个新的Node,l作为新增元素的pre,新值为新元素value,next为空
- last指向新的元素
- 如果是第一个元素,first指向新元素,若不是第一个元素则,用当前元素的next指向新的元素