LinkedList的构造器有空参构造器的,查看源码,我们发现,在我们代码中 new LinkedList();的时候,是创建了一个空的链。
/**
* Constructs an empty list.
*/
public LinkedList() {
}
再看下add方法:调用了linkLast方法,添加元素e到链表的尾部:
public boolean add(E e) {
linkLast(e);
return true;
}
看下linkLast的源码:实际上是将e封装为Node放到链表的尾部。
/**
* Links e as last element.
*/
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++;
}
那Node又是哪里的呢?再看源码,其实Node就是LinkedList的内部类。内部提供了三个参数的构造器 Node(Node<E> prev, E element, Node<E> next),在linkLast(e)时,调用了这个三个参数的构造器。
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;
}
}
对LinkedList的操作,其实内部就是对一个双向链表的操作,如果熟悉数据结构中的双向链表的话, LinkedList的源码很容易就明白了。