①LinkedList简单介绍
是一个继承于AbstractSequentialList的双向链表。它可以被当成堆栈、队列或双端队列进行操作。
实现了List接口,能对它进行队列操作。
实现了Deque接口,能当作双端队列使用。
实现了Cloneable接口,覆盖了clone(),能克隆。
实现了java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
是非同步的
②LinkedList构造函数
// 默认构造函数
LinkedList()
// 创建一个LinkedList,保护Collection中的全部元素。
LinkedList(Collection extends E> collection)
③AbstractSequentialList简介
介绍一下AbstractSequentialList。毕竟,LinkedList是AbstractSequentialList的子类。
1)AbstractSequentialList 实现了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)这些函数。这些接口都是随机访问List的,LinkedList是双向链表;既然它继承于AbstractSequentialList,就相当于已经实现了“get(int index)这些接口”。
2)我们若需要通过AbstractSequentialList自己实现一个列表,只需要扩展此类,并提供 listIterator() 和 size() 方法的实现即可。若要实现不可修改的列表,则需要实现列表迭代器的 hasNext、next、hasPrevious、previous 和 index 方法即可。 LinkedList是AbstractSequentialList的子类。
3)AbstractSequentialList实现了get(int index)、set(int indext, E element)、add(int index,E element)和remove(int index)这些函数。这些接口都是随机访问List的,LinkedList是双向链表,既然它继承了AbstractSequentialList,就相当于已经实现了这些接口。
4)若需要通过AbstractSequentialList自己实现一个列表,只需要扩展此类,并提供listIterator()和size()方法的实现即可。若要实现不可修改的列表,则需要实现列表迭代器的hasNext、next、hasPrevious、previous和index方法即可。
④LinkedList其他介绍
1)LinkedList包含两个重要的成员: header和size
2)Header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量:previous,next,element。Previous是该节点的上一个节点,next是该节点的下一个节点,next是该节点的下一个节点,element是该节点所包含的值。
3)先对LinkedList的整体实现进行大致说明:
LinkedList实际上是通过双向链表去实现的。既然是双向链表,那么它的顺序访问会非常高效,而随机访问效率比较低。
既然LinkedList是通过双向链表的,但是它也实现了List接口{也就是说,它实现了get(int
location)、remove(int location)等“根据索引值来获取、删除节点的函数”}。
4)LinkedList是如何实现List的这些接口的,如何将“双向链表和索引值联系起来的”?
实际原理非常简单,它就是通过一个计数索引值来实现的。例如,当我们调用get(int location)时,首先会比较“location”和“双向链表长度的1/2”;若前者大,则从链表头开始往后查找,直到location位置;否则,从链表末尾开始先前查 找,直到location位置。
⑤LinkedList其他介绍
(01) LinkedList 实际上是通过双向链表去实现的。
它包含一个非常重要的内部类:Entry。Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值,上一个节点,下一个节点。
(02) 从LinkedList的实现方式中可以发现,它不存在LinkedList容量不足的问题。
(03) LinkedList的克隆函数,即是将全部元素克隆到一个新的LinkedList对象中。
(04) LinkedList实现java.io.Serializable。当写入到输出流时,先写入“容量”,再依次写入“每一个节点保护的值”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
(05) 由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。
⑥LinkedList遍历方式
LinkedList支持多种遍历方式。建议不要采用随机访问的方式去遍历LinkedList,而采用逐个遍历的方式。
(01) 第一种,通过迭代器遍历。即通过Iterator去遍历。
for(Iterator iter = list.iterator(); iter.hasNext();)
iter.next();
(02) 通过快速随机访问遍历LinkedList
int size = list.size();
for (int i=0; i
list.get(i);
}
(03) 通过另外一种for循环来遍历LinkedList
for (Integ