大家好,我是IT修真院武汉分院第15期的JAVA学员,一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网Java任务10,深度思考中的知识点——LinkedList简单介绍
1.背景介绍
2.知识剖析
3.常见问题
4.编码实战
5.扩展思考
6.参考文献
7.更多讨论
1.背景介绍
LINKEDLIST是COLLECTION下的一个LIST实现,就像ARRAYLIST一样。
和ArrayList不同的是它是链表结构,而ArrayList是顺序结构。我们平常使用的list是一样的,理论上来说一种list就可以完成我们所有的需求。
但是它们在运行过程中有区别的,完成需求所需要的资源也不相同,至于什么情况下使用哪种list就看需求和当前情况了。
2.知识剖析
LINKEDLIST的本质是双向链表
1、LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
2、LinkedList包含两个重要的成员:header 和 size。
header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。 Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。size是双向链表中节点的个数。
双向链表结构
链表:链表是一种重要的数据结构,有单链表和双链表之分
单链表:
1.由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接
2.这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点
3.最后一个结点的head指向为null,这样一来就连成了上述所说绳子一样的链
4.对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。
双向链表结构:
1.双链表和单链表相比,多了一个指向尾指针(tail),双链表的每个结点都有一个头指针head和尾指针tail,双链表相比单链表更容易操作
2.双链表结点的首结点的head指向为null,tail指向下一个节点的tail;尾结点的head指向前一个结点的head,tail 指向为null,是双向的关系;
3.在单链表中若需要查找某一个元素时,都必须从第一个元素开始进行查找,而双向链表除开头节点和最后一个节点外每个节点中储存有两个指针
4.这连个指针分别指向前一个节点的地址和后一个节点的地址,这样无论通过那个节点都能够寻找到其他的节点。
3.常见问题
3.1 什么时候使用LINKEDLIST?
3.2 怎么确定一个数组时不是空的?
3.3 LINKEDLIST 是线程安全的吗?
3.1 什么时候使用LINKEDLIST?
当你需要频繁查询数组的时候使用ArrayList比较快,当你需要频繁操作数组进行增删插入操作的时候使用LinkList比较合适。
3.2 怎么确定一个数组是不是空的?
可以直接调用size方法,查看数量
3.3 LINKEDLIST 是线程安全的吗?
LinkedList同样是非线程安全的,只在单线程下适合使用。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须保持外部同步。
4.编码实战
5.扩展思考
LINKEDLIST并发插入时节点覆盖的问题?
当多个线程同时获取到相同的尾节点的时候,然后多个线程同时在此尾节点后面插入数据的时候会出现数据覆盖的问题。
6.参考文献
https://segmentfault.com/a/1190000011419072