Java集合系列02--LinkedList

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36952611/article/details/74990386

LinkedList

(1)LinkedList是一个继承与AbstractSequentialList的双向链表。它也可以被当做堆栈、队列和双向队列使用。
(2)LinkedList实现了List接口,能对它进行队列操作。
(3)LinkedList实现了Deque接口,即可以当做双端队列使用。
(4)LinkedList实现了Cloneable,即可以覆盖clone()方法。
(5)LinkedList实现了java.io.Serializable接口,这就意味着它支持序列化,可以通过序列化去传输。

AbstractSequentialList简介
AbstractSequentialList实现了add、get、remove这些函数,这些函数的接口都是随机访问List的,LinkedList是双向链表;既然它继承与AbstractSequentialList那么它也就实现了这些方法。
此外,我们若需要通过AbstractSequentialList自己实现一个列表,只需要扩展此类,并提供 listIterator() 和 size() 方法的实现即可。若要实现不可修改的列表,则需要实现列表迭代器的 hasNext、next、hasPrevious、previous 和 index 方法即可。

LinkedList与Collection的关系图

这里写图片描述
LinkedList的本质是双链表。
(1)LinkedList继承与AbstractSequentialList并且实现了Deque接口。
(2)LinkedList包含两个重要成员:header和size;
header是双向链表的表头,它是双向链表所对应表头类Entry的实例。Entry包括成员变量:previous、next、element。
size是表中节点的个数。

LinkedList总结

LinkedList是基于双向链表实现的。既然是基于双向链表实现那么它的顺序访问速度非常快而随机访问速度就会慢许多。同时它也实现了List接口那么它就实现了一些根据索引来操作链表的方法。它是如何将双向链表和索引值联系起来的呢?
实现起来非常简单,它是通过记数索引来实现的。例如remove(int index)他会比较index与size/2的大小,从而决定从链表的头或尾开始寻找。
(01) LinkedList 实际上是通过双向链表去实现的。
它包含一个非常重要的内部类:Entry。Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值,上一个节点,下一个节点。
(02) 从LinkedList的实现方式中可以发现,它不存在LinkedList容量不足的问题。
(03) LinkedList的克隆函数,即是将全部元素克隆到一个新的LinkedList对象中。
(04) LinkedList实现java.io.Serializable。当写入到输出流时,先写入“容量”,再依次写入“每一个节点保护的值”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
(05) 由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)
(06) LinkedList可以作为FIFO(先进先出)的队列。
(07) LinkedList可以作为LIFO(后进先出)的栈。

LinkedList与ArrayList的对比

(1)顺序插入速度ArrayList会比较快。因为ArrayList是基于数组实现的,数组是事先new好的,只要往指定位置塞一个数据就好;LinkedList则不同,每次顺序插入的时候都会new一个对象出来,如果对象比较大,那么时间必然后长一点,再加上一些引用赋值的操作,所以速度必然就会慢一些。
(2)基于上面这一点,因为LinkedList里面不仅维护了待插入的元素,还维护了Entry的前置和后继,如果LinkedList中的Entry非常多,那么LinkedList将比ArrayList更耗费内存。
(3)有人认为LinkedList做插入、删除操作更快,这种说法并不准确:
1、LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后的Entry的引用地址。
2、ArrayList做插入、删除时候,慢在数组的批量copy,快在寻址。

所以如果待插入、删除的元素是数据结构的前半段,尤其是非常靠前的时候,LinkedList的效率将大大高于ArrayList,因为ArrayList将需要大量copy元素;越往后对LinkedList没有什么影响,但ArrayList由于批量拷贝的元素变少效率也将追上甚至超过LinkedList。
从这个分析来看,如果你十分确定你的插入、删除元素师前半段,那么就使用Linkedlist,否则考虑使用ArrayList。如果不确定该怎么办呢?那么就建议使用Linkedlist,因为一LinkedList整体插入、删除执行效率比较稳定,二插入元素很有可能就会带来一次扩容,扩容是一个非常消耗时间和空间的操作。

LinkedList与ArrayList的迭代

ArrayList使用普通的for循环遍历,LinkedList使用foreach循环比较快。
ArrayList是实现了RandomAccess接口,而LinkedList没有实现这个接口。无论怎么样都不要使用普通for循环遍历LinkedList其速度会慢的令人发指。

猜你喜欢

转载自blog.csdn.net/qq_36952611/article/details/74990386