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实现”一文中已经对单链表 ...
随机推荐
- 一个简单的Linux后门程序的实现
该程序实质是一个简单的socket编程,在受害方上运行攻击代码(后门进程),通过socket打开一个预设端口,并监听,等待攻击方的链接.一旦攻击方通过网络链接工具试图链接该socket,那么后门进程立 ...
- python类的继承-1
#!/usr/bin/python3 #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = ...
- IntellJ IDEA javax.servlet.ServletException 找不到javax.servlet.ServletException的类 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
误状态:错误显示 解决: (1)说明缺少包---->添加如下包配置 <dependency> <groupId>javax.servlet.jsp</groupId ...
- PrefixHeader.pch 在工程中的使用
1) 新建一个pch文件 2) 在 工程 Build Settings 中搜索 header 将Precompile Prefix Header 置为YES 2) 选中pch文件, 将右侧相对路径 ...
- Hdu1401 Solitaire 2017-01-18 17:21 33人阅读 评论(0) 收藏
Solitaire Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- spring MVC controller中的方法跳转到另外controller中的某个method的方法
1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 本来以为挺简单的一 ...
- Android-Java-多线程
上一篇博客 Android-Java-进程与线程,简述了进程与线程,如果先知道多线程必须要懂得CPU相关的知识: CPU:CPU最小的控制单元是线程 CPU:看起来是同时执行多个进程,实际上是CPU在 ...
- Sql Server 2008 压缩数据库日志文件
第一步:将数据库设置为简单模式 选中数据库点右键->属性: 第二步:收缩数日志文件 1, 2, 第三步:将恢复模式改回为完整模式 如果你觉得用UI界面麻烦,那你就用SQL语句吧 ...
- JavaScript中Ajax的使用
AJAX全称为“Asynchronous javascript and XML”(异步javascript和XML),是指一种创建交互式网页应用的网页开发技术.通过在后台与服务器进行少量数据交换,AJ ...
- LeetCode142:Linked List Cycle II
题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...