文档章节

看看 LinkedList<E> Java 9

woshixin
 woshixin
发布于 07/19 19:23
字数 814
阅读 6
收藏 0

    终于迎来了 LinkedList 类,实现的接口就有点多了 Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>。LinkedList是一个实现了List接口和Deque接口的双端链表,有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。

    下面这张图是从(https://blog.csdn.net/qq_19431333/article/details/54572876)复制来的

    请注意,此实现不是线程安全的。如果多个线程同时访问链接列表,并且至少一个线程在结构上修改列表,则一般在外部用synchronized修饰。如果想使LinkedList变成线程安全的,可以使用如下方式:

    List list = Collections.synchronizedList(new LinkedList(...));

    该类有两个构造方法,其中有参数的那个接口接受 Collection<? extends E> 类型的

    这个构造方法可以看看的 ,其实实现调用的是 addAll(int index, Collection<? extends E> c) 方法, LinkedList类的有两个重要的transient Node<E> first 和 transient Node<E> last 字段, Object[] a = c.toArray(); 先将c转化为 Object[],后续使用for循环遍历,然后就有一种写指针的感觉了,当初学习c语言写列表的感觉,不过在java里面用了Node这个类来处理。      其实Node这个静态内部类的实现也比较简单,但是java实现链表结构的关键,相当于当前对象,下一个指针,前一个指针。 

    因为实现了很多接口,然后在linkedList里面拥有很多方法,主要看看列表比较独有的吧,比如下面的在表头和表尾插入数据,先初始化一个Node<E> ,然后创建一个newNode,然后表头指向newNode,其中linkBefore,unlinkFirst,unlinkLast,unlink的实现也是类似的。

    

    如果看懂了上面的方法,那么getfirst和getLast就很简单了,就是把表头和表尾返回一下

    那么看remove表头和表尾的方法也是很简单的,其中调用的是unlink开头的方法,比如unlinkFirst,unlinkLast。

    但是如果你remove的是一个 object,那么需要遍历了,不过这里找到一个相等的值,那么就return啦。

     在clear方法中处理起来比较简单,就是把数据清楚掉,其中是帮助 GC回收各个节点

    我们看看查询某个节点的方法,这边将 size 右移一位,判断index离哪一端比较近,然后遍历到相应节点返回,因为是链表结构,所以需要一个遍历,时间复杂度还是有的。

    这边又有 peek 和 poll的方法,这些应该是队列里的吧,感觉有些方法有重复的。

    来看看序列化接口实现的两个方法writeObject和readObject,使用s.defaultReadObject(),其中readObject后面会有一个linkLast方法

    智商有限,时间仓促,就先写到这里吧  !  

    有什么讨论的内容,可以加我微信公众号:

 

© 著作权归作者所有

共有 人打赏支持
woshixin
粉丝 23
博文 225
码字总数 201232
作品 0
杭州
程序员
ArrayList和LinkedList的几种循环遍历方式及性能对比分析

最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据Arr...

Trinea
2013/10/31
0
1
JDK源码之LinkedList

LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实...

村长大神
2014/03/27
0
0
Java_LinkedList_数据结构

java api 在包java.util.LinkedList中有一个LinkedList双向链表类;在由于最近有许多的java课程作业,兴趣之余自己写了一个类似的LinkedList类。由于是从C/C++转向java的,代码中还是有许多C...

掬一捧
2012/04/16
0
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
08/08
0
0
JDK容器学习之LinkedList:底层存储&读写逻辑

LinkedList的底层结构及读写逻辑 链表容器,通常适用于频繁的新增删除,遍历的方式访问数据元素的场景 LinkedList 底层数据结构为链表,非线程安全,本片博文则简单分析下增删改对链表的操作...

小灰灰Blog
2017/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部