这一篇我们介绍LinkedList。LinkedList结构简单详细请往下看。
简单介绍
按照源码中的说明,LinkedList是List与Deque接口的双链表实现,实现所有可选操作,并允许所有类型的数据作为元素包括null。
值得注意的是,LinkedList在根据索引查找的时候,会根据此索引离头指针与尾指针的距离进行权衡,选择开始遍历首位从头还是还是从尾开始。
LinkedList不是线程安全的,如果多个线程同步的访问一个LinkedList并且至少有一个线程改变了这个list的结构,那么这个LinkedList必须要做额外的加锁操作来确保线程的安全性。这个额外的操作可以是在如果这个list被某个对象封装,可以对那个对象加锁来完成,如果没有那种对象,可以使用: List list = Collections.synchronizedList(new LinkedList(...)); 来完成加锁功能。
LinkedList返回的Iterator是基于快速失败机制的。关于快速失败机制可以看。
存储结构
与前几篇文章一样,我们通过查看LinkedList的属性来探讨其存储结构:
他的属性内容挺简单,就这么几个。我们简单介绍一下
-
size: 其实不用多说,就是记录存储元素的数量的。
-
first: 我们说过,LinkedList是一个双向链表,那这个first就是这个双向链表的头指针了。
-
last: 这个last就是双向链表的尾指针。
现在我们具体来看一下LinkedList内部结点Node这个类长什么样子:
很简单,包含一个存储数据的item,一个前继节点prev,一个后继节点next,现在我们就可能清晰的认识到LinkedList的存储结构了,我们用个图来加深一下印象。
其中prex为null的就是head节点,也就是图中第一个节点,next为null的节点就是last节点,就是图中的最后一个节点
总结
- 与ArrayList相比较,都实现了Collection接口
- ArrayList基于数组,具有较高的查询速度,而LinkedList基于双向链表,具有较快的添加或者删除的速度。
- 由于使用链表这种数据结构,不需要扩容