上篇文章,我们分析了ArrayLlist及其源码,链接在这:ArrayList源码解析
这一篇文章,我们来学习一下LinkedList,看看会不会有新的收获。
目录
1.引子
LinkedList的数据结构是基于双向链表的,数据结点中有两个指针,分别指向直接前驱和直接后继。LinkedList不仅实现了list集合接口,还实现了Deque接口,可以做双向队列,栈,集合来使用。
先看一下结点的组成:
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;
}
}
item:结点数据值
next:后继节点
prev:前驱结点
很多人都说LinkedList插入删除速度快,查找速度慢,这是对的吗?为什么会这样呢?
2.构造函数
1.空参构造函数
构造一个空的集合
源码:
public LinkedList() {
}
2.Collection集合构造函数
入参为集合
源码:
transient int size = 0;
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}
对于链表来说,一个集合怎么全部添加到链表中呢,上述的addAll方法就实现了添加操作,初始化的时候,传入的size为0,表示从下标0的位置开始插入。
来看一下addAll方法是怎么实现的:
这个方法是从指定位置开始,插入特定的集合元素
public boolean addAll(int index, Collection<? extends E> c) {
checkPositionIndex(index);
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
Node<E> pred, succ;
if (index == size) {
succ = null;
pred = last;
} else {
succ = node(index);
pred = succ.prev;
}
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null