Java之集合(五)LinkedList
转载请注明源出处:http://www.cnblogs.com/lighten/p/7298017.html
1.前言
Java中另一个常见的list就是本章将要讲的LinkedList。ArrayList的实现方式是数组,而LinkedList的实现方式是链表。两者在性能上有着明显的不同,之前讲过ArrayList的特点就是易于查找,弱于插入,而LinkedList正好相反。这些都是和其数据结构有关,具体使用哪个,需要看操作数组的主要方向是查找还是插入了。
2.AbstractSequentialList
LinkedList并没有直接继承自AbstractList,而是继承自抽象父类AbstractSequentialList,其是继承自AbstractList的。AbstractSequentialList出现的原因在于其较于AbstractList对于"random access"(随机访问)方面更有优势。其只定义了如下方法:

这些都是针对于链表结构的相关方法,而具体实现不像ArrayList的那样直接操作数组的下标(链表没有下标)。这些实现都是通过listIterator这个抽象方法完成的:


其它方法就不再一一列出,顺带一提的是,其返还的迭代器就是ListIterator。这些就是AbstractSequentialList的全部内容了。
3LinkedList
LinkedList继承自AbstractSequentialList,同时实现了List、Deque和Cloneable接口。其结构也一样的简单明了。数据结构如下:

一个元素个数,一个头结点,一个尾结点。由于是链表,所以其是不需要扩容的,先看看Node的相关结构吧。

很简单的结构,前一个结点的引用,下一个结点的引用和本结点的内容。这是一个双向链表。

这是一个简单的插入到最前的一个实现:获取当前第一个元素,生成插入元素,替换成头结点。如果当前第一个元素为null,尾结点自然也就是头结点了,否者原头结点持有插入在其前面的结点的引用。其它的操作也基本与此类似,不再进行叙述,最后会给出一个图来看其操作。
有意思的是LinkedList和ArrayList一样并没有使用父类的方法,而是重写了一套。所以其并没有使用迭代器完成get,remove等操作。

node方法做了一点小优化:

根据结点位置是在前半还是后半决定是顺序遍历还是逆序遍历,这样尽可能的减少遍历次数。
最后看看迭代器,其实也没什么可看的了:

定位到指定结点位置,然后对其进行操作罢了。逆序的迭代器实现就更简单了:

最后值得一提的是,LinkedList并没有像ArrayList一样重写了SubList方法,所以其使用的还是抽象父类AbstractList实现的方法。
4.示意图

移除操作类似,这里不再给出示意图。
Java之集合(五)LinkedList的更多相关文章
- Java自学-集合框架 LinkedList
Java集合框架 LinkedList 序列分先进先出FIFO,先进后出FILO FIFO在Java中又叫Queue 队列 FILO在Java中又叫Stack 栈 示例 1 : LinkedList ...
- Java集合(五)--LinkedList源码解读
首先看一下LinkedList基本源码,基于jdk1.8 public class LinkedList<E> extends AbstractSequentialList<E> ...
- 【Java集合】LinkedList详解前篇
[Java集合]LinkedList详解前篇 一.背景 最近在看一本<Redis深度历险>的书籍,书中第二节讲了Redis的5种数据结构,其中看到redis的list结构时,作者提到red ...
- Java小白集合源码的学习系列:LinkedList
目录 LinkedList 源码学习 LinkedList继承体系 LinkedList核心源码 Deque相关操作 总结 LinkedList 源码学习 前文传送门:Java小白集合源码的学习系列: ...
- Java学习-集合(转)
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- 算法篇(前序)——Java的集合
菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs 以及算法篇全文链接 ...
- JAVA基础--JAVA API集合框架(其他集合类,集合原理)15
一.ArrayList介绍 1.ArrayList介绍 ArrayList它是List接口的真正的实现类.也是我们开发中真正需要使用集合容器对象. ArrayList类,它是List接口的实现.肯定拥 ...
- Java重要类之LinkedList
一.ArrayList与LinkedList 基本概念:List是一个接口,Arraylist和LinkedList是它的两个实现类,只是实现的方式不一样.我在“单链表java实现”一文中已经对单链表 ...
随机推荐
- python操作数据库-安装
首先是下载软件: 链接:http://pan.baidu.com/s/1nvp1imX 密码:6i0x 之后就是一系列设置. 安装教程:自行百度就行.需要注意的是设置my.ini时,需要加上这些东西( ...
- 对MVC模型的自悟,详尽解释,为了更多非计算机人员可以理解
今天小编在复习之前刚刚学会的一个小项目,然后突然对MVC有了新的理解,决定迅速将其写成文档,否则可能会忘记,就算是一个顿悟,学了java语言好久了,刚刚才对其有了比较深入的理解,希望对于同样的人能够有 ...
- Vivado 常见报错
1.[Synth 8-2543] port connections cannot be mixed ordered and named 说明例化时最后一个信号添加了一个逗号. 2. 原因:报告说明有一 ...
- webservice大文件怎么传输
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- OpenGL中的帧缓存
OpenGL中的帧缓存 在OpenGL窗口中, 左下角的像素为(0, 0). 一般而言, 像素(x, y)占据的矩形区域左下角为(x, y), 右上角为(x+1, y+1). 1. 缓存及其用途 [1 ...
- [Java]ArrayList集合的contains方法
用到集合ArrayList时经常会用到里面自带的方法boolean contains(Object o);此方法用于判断集合里面是否包含元素o,现在讨论下在Object类型为类类型的时候的情况: cl ...
- 第一章 JVM内存结构
注意:本系列博客,主要参考自以下四本书 <分布式Java应用:基础与实践><深入理解Java虚拟机(第二版)><深入分析Java web技术内幕><实战jav ...
- EBS _ALL, _TL, _VL, _V,_F,_VL,_A,_AVN and what else
http://hi.baidu.com/einsteinalbert/item/54579250efc637abadc85705 _ALL, _TL, _VL, _V,_F,_VL,_A,_AVN a ...
- api接口签名相关文章
http://www.cnblogs.com/hnsongbiao/p/5478645.htmlhttp://www.cnblogs.com/codeon/p/5900914.html?from=ti ...
- Python学习-29.Python中列表的一些操作
in关键字: 注意这个是关键字,用来判断元素是否在集合中存在. list = ['a','b','c'] print('a' in list) print('f' in list) 将依次输出 Tru ...