版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2017/08/29/Java源码之LinkedList/
访问原文「Java源码之LinkedList」
关于LinkedList
似乎我们在工作中很少用到LinkedList
,大部分都是使用ArrayList
。先来看一下LinkedList
的定义吧,它是List
和Deque
接口的双向链表实现;实现所有可选列表操作,并允许所有元素(包括null);所有的操作都实在操作双向列表;索引到列表中的操作将从开始或结束遍历列表,以更接近指定的索引为准。从这个定义来看,这个LinkedList
更适合较多插入和删除元素,较少读取元素,因为插入和删除元素不涉及重排数据。
至于Deque
是什么。Deque
是支持两端元素插入和移除的线性集合,而名称deque
是双端队列(double ended queue)
的缩写,通常发音为deck
。既然它是个列表,那它确实继承了Queue
,也支持所有与Queue
相关的进
、出
方法。本文不再对deque
做详细说明。
LinkedList主要成员变量
下面是LinkedList
的主要成员变量。可以看到包含头指针和尾指针,而Node
也是双向链表节点的表示,也就是说LinkedList
真的是双向链表表示的。
|
|
LinkedList核心方法
LinkedList的主要方法如下所示。可以看到这些方法都是对链表的操作,包括向头、尾插入节点,向一个节点之前插入节点,删除头尾、中间节点等。
|
|
List常用方法
为什么叫List
常用方法,因为LinkedList
是双向队列,包含队列操作,这节不予说明。
下面列出了add
、remove
、get
这三个常用方法。从前两个方法可以看到它用到了上节介绍的核心方法;而get
方法可以看到是一个遍历搜索的方法,可以明显的发现如果这个列表的get
方法在使用中频繁出现,那么我们应该选择ArrayList
而不是LinkedList
。
|
|
Deque常用方法
与上节相似,因为LinkedList
实现了Deque
接口,包含队列
和栈
操作,这节将介绍几个常用的队列
和栈
操作。
下面列出了peek
、poll
、offer
、push
、pop
这五个常用方法。peek
方法直接返回头节点,poll
方法等同于第三节介绍的unlinkFirst
方法,offer
方法最终等同于linkLast
,push
方法等同于addFirst
方法,而addFirst
方法实际上等同于第三节介绍的linkFirst
方法,pop
方法最终等同于unlinkFirst
。peek
、poll
、offer
这三个方法实现了队列
这一先入先出
的数据结构,而push
、pop
这两个方法实现了栈
这一先入后出
的数据结构。
|
|
总结一下
LinkedList
作为一个平时不常使用的类其结构是比较简单的。由于其内部表示为链表结构,所以核心方法均为链表操作。进而所有的主要方法都是由这些核心方法扩展而来。
本文只介绍几个常用的方法,实际上LinkedList
中包含了很多其他方法,例如:addFirst
、addLast
、removeLast
、offerFirst
、offerLast
等等,实际上都是由本文第三节介绍的核心方法扩展或者仅仅是改了名字,有兴趣的同学可以详细学习一下,我这里就不详细介绍了。