源码分析之LinkedList
1、概述
LinkedList是基于双向链表实现的一种数据结构,其特点是插入和删除元素非常的方便(常数级算法操作)。
2、数据结构

3、LinkedList部分源码展示
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;
//备注:链表数据结构不存在大小限制不存在扩容的说法。
}
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;
}
}
备注:
LinkedList实现了Deque(双端队列),所以其可以用来做队列数据结构使用。
说明:
LinkedList操作方法比较多,这里就不展示代码说明,但是总之其链表数据结构决定其大部分操作都是基于移动前驱和后继的引用来实现的。
4、注意说明
1、LinkedList继承和实现体系(实现了List、Deque ... )
2、LinkedList的成员属性Node(注意transient修饰的属性,不被序列化)
3、LinkedList不存在扩容这么一说,因为其在物理内存存储不是连续存储的。数组是占据连续内存块的。
4、LinkedList查询和迭代不太方便,因为其链表结构使其每次只能从一端开始一个一个节点的查询比较,
但其链表的结构使其插入和删除的效率非常的高(只需要改变某个节点的前驱和后继的指针指向即可)
5、LinkedList的特有迭代器是双向的,但是并没什么卵用,我几乎没用过
6、迭代LinkedList对象时,如果使用对象修改数据的时候会出现ConcurrentModificationException(
fail- fast快速失败机制),推荐使用迭代器来修改数据
7、由于其实现的Deque双端队列,有些场景下可以使用LinkedList作为队列实现
8、由于java.util下的集合不是并发集合所以当在多线程编程时,推荐使用并发包下的集合对象,或使用Collections.
synchronizedCollection(x extends Collection);
备注:当业务是频繁插入和删除操作时,推荐使用LinkedList对象(插入删除迅速)
其实LinkedList的源码实现是比较简单的,也就只涉及到链表数据结构
自己应该要实现链表数据结构,加深理解。
总结:
LinkedList是基于双向链表实现的一种数据结构,其插入和删除操作非常的迅速,但是对于查询操作其需要从头开始遍历,所以查询操作效率比较低。在某些场景下使用LinkedList是很不错的选择。由于LinkedList已经实现了队列功能所以其可以用来当做队列使用