详细注释
LinkedList类属性与继承关系:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
/**
* 实际元素个数
*/
transient int size = 0;
/**
* 链表头结点
*/
transient Node<E> first;
/**
* 链表尾结点
*/
transient Node<E> last;
//
}
(1)LinkedList底层实现为双向链表。链表的特点就是插入删除数据快,而查询数据慢。
(2)因为使用链表的原因,所以不存在容量不足的问题,没有扩容机制。
(3)从后面的源码分析中我们也可以看出,LinkedList支持null并且LinkedList没有同步机制。
(4)LinkedList直接继承于AbstractSequentialList,同时实现了List接口,也实现了Deque接口(双端队列)。
AbstractSequentialList为顺序访问的数据存储结构提供了一个骨架类实现,如果要支持随机访问,则优先选择AbstractList类继承。LinkedList 基于链表实现,因此它继承了AbstractSequentialList。
内部类Node:用于存放实际元素的结点
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;
}
}
类的构造方法:
/**
* 无参数构造函数
*/
public LinkedList() {
}
public LinkedList(Collection<? extends E> c) {
// 调用无参数构造函数
this();
// 添加进参数集合c里所有的元素
addAll(c);
}
添加(单个)操作:
public boolean add(E e) {
// 将元素e添加到链表尾部
linkLast(e);
return true;
}
void linkLast(E e) {
// 保存尾结点
final Node<E> l = last;
// 创建以元素e为数据域的新结点,将其前结点(prev)指向当前尾结点(l)
final Node<E> newNode =