这期内容当中小编将会给大家带来有关Java中LinkedList的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
<代码> LinkedList> 代码既实现了<代码> 代码>列表,又实现了<代码>双端队列> 代码,前者使它能够像使用<代码> ArrayList 代码>一样使用,后者又使它能够承担队列的职责。<代码> LinkedList> 代码内部结构是一个双向链表,我们在分析<代码> ArrayDeque> 代码时提到过这个概念,就是扩充单链表的指针域,增加一个指向前一个元素的指针前强> <强>。
AbstractSequentialList
<代码> AbstractSequentialList 代码>是<代码> LinkedList> 代码的父级,它继承自<代码> AbstractList> 代码,并且是一个抽象类,它主要为顺序表的链式实现提供一个骨架:
这个类提供了一个框架实现的<强> 强>列表界面最小化所需的努力实现这个接口支持的“顺序access"数据存储(如一个链表)。随机存取数据(比如一个数组),<强> AbstractList 强>应该优先于这个类使用。
引用>意思是它的主要作用是提供一个实现列表<代码> 代码>接口的骨架,来减少我们实现基于链式存储的实现类时所需的工作量。<代码> AbstractSequentialList> 代码并没有做很多特殊的事情,其中最主要的是提供一个方法的默认实现,并将以下方法抽象,以期有更符合场景的实现:
public abstract ListIterator, listIterator (int 指数); 其他一些方法的实现都利用了这个<代码> listIterator 代码>方法,我们不再一一查看了。下面我们分析<代码> LinkedList> 代码的实现
LinkedList的结构
<代码> LinkedList> 代码的继承结构如下所示:
可以看的到,<代码> LinkedList> 代码也实现了<代码>可克隆代码>,<代码> java.io.Serializable> 代码等方法,借鉴于<代码> ArrayList> 代码的经验,我们可以想到它的<代码> 代码>也克隆是浅克隆,在序列化方法也采用了同样的方式,我们就不再赘述了。
构造方法与成员变量
数据单元节点
在介绍链表结构时提到过,其数据单元分为数据域和指针域,分别存储数据和指向下一个元素的位置,在Java中只要定义一个实体类就可以解决了。
private static class Node, { ,,,E 项目;,//数据 ,,,Node ,第二,,//下一个元素 ,,,Node ,上一页,,//上一个元素 ,,,节点(Node ,第二),{ ,,,,,,,this.item =,元素; ,,,,,,,this.next =,下一个; ,,,,,,,this.prev =,上一页; ,,,} } 成员变量
<代码> LinkedList> 代码成员变量主要有三个,而且其意义清晰可见。
//,记录当前链表的长度 时间=transient int  size 0;//,第一个节点 transient Node< E>,第一;//,最后一个节点 transient Node< E>,去年,构造函数
因为链表没有长度方面的问题,所以也不会涉及到扩容等问题,其构造函数也十分简洁了。
public LinkedList (), { } public LinkedList (Collection<?, extends E>, c), { ,,,(); ,,,addAll (c); }一个默认的构造函数,什么都没有做,一个是用其他集合初始化,调用了一下<代码> addAll 代码>方法。<代码> addAll 代码>方法我们就不再分析了,它应该是和添加一个元素的方法是一致的。
重要方法
<代码> LinkedList> 代码既继承了<代码> 代码>列表,又继承了<代码>双端队列> 代码,那它必然有一堆<代码>添加代码>,<代码>删除代码>,<代码> addFirst 代码>,<代码> addLast> 代码等方法。这些方法的含义也相差不大,实现也是类似的,因此<代码> LinkedList> 代码又提取了新的方法,来简化这些问题。我们看看这些不对外的方法,以及它们是如何与上述函数对应的。
//将一个元素链接到首位 private void  linkFirst (E e), { ,,,//先将原链表存起来 ,,,final Node, f =,第一; ,,,//定义一个新节点,下指其向原来的第一次 ,,,final Node , newNode =, new Node<祝辞(null,, e, f); ,,,//将首先指向新建的节点 ,,,first =, newNode; ,,,//原链表为空表 ,,,if (f ==, null) ,,,,,,,//把去年也指向新建的节点,现在第一个与最后一个都指向了它 ,,,,,,,last =, newNode; ,,, ,,,,,,,//把原链表挂载在新建节点,也就是现在的第一之后 ,,,,,,,f.prev =, newNode; ,,,大小+ +; ,,,modCount + +; }//与linkFirst类似 void linkLast (E e), { ,,,//? } ,//在某个非空节点之前添加元素 void linkBefore (e, E Node Java中LinkedList的作用是什么