collection集合 地址_java集合系列(5)LinkedList

这篇文章开始介绍LinkList。他和ArrayList有一些相似,在上一篇文章讲解 ArrayList时,我们知道ArrayList是以数组实现,它的优势是查询性能高,劣势是按顺序增删性能差。如果在不确定元素数量的情况时,不建议使用ArrayList。这种情况下,我们就可以使用LinkedList了。所以这篇文章,旨在从源码的角度进行分析和理解LinkedList。

OK,开始今天的文章。

一、LinkedList认识

1、由链表认识LinkedList

我们应该都学过数据结构与算法,如果你知道链表的实现原理,那么你就可以直接看LinkedList的基本认识了,可以跳过本小节,如果你没学过,或者是不牢固,那么就先看看本小节再往下面学习吧。

我们想要认识链表有一个例子可以形象的去表示,我们都看过警察捉贼的故事,比如说警察现在要抓一个小偷,得知小偷在A处,结果警察一去发现没有,但是A处的相关人员说小偷可能在B处,结果警察又去了B处,发现又没有,被告知可能在C处,警察又去了C处,没有之后得到情报又去了D、E、F等等。最终抓获了小偷,我们把整个抓捕过程其实就可以看成一条线索链,或者说叫做链表。我们可以看到每一处地点,我们就可以看做链表的一个节点,每一个节点要包含两个信息:一个是本地的信息,一个是下一个地点的信息。

下面使用一张图来直观的表示一下:

4c1267b47627a8091c37788de095c790.png

下面我们就可以对上面的这个链表进行一个分类:

  • 单链表:就是上面我们提到的,只有下一处的地址。
  • 双链表:表示不仅存储下一处的地址,还存储上一处的。

fb90746c7871fb4e090c52225be53c5d.png
  • 循环链表:就是说整个地址构成一个循环链。
  • 有序链表:以某个标准,给链表的元素排序,比如比较内容大小、比较哈希值等

在上面我们已经看到了链表的实现方式还有分类,当然链表还有一些基本的特性,需要我们去了解:

  • 在数组中,是通过索引访问元素的。但是链表不能,只能通过链一个一个的找。这个说明了链表的优势不在快速找到元素。
  • 链表的优势在于定点删除/插入元素,因为链表影响的最多就是给定元素的左右的两个链
  • 这里就有个trick, 由于改变右边链的时候,如果不先存储右边的结点,那么右边的结点的元素就找不到了,所以改变结点的指针的时候,会先暂存下一个结点。
  • 另外单链表找不到它的父亲结点(上一个结点),所以会经常用prev来暂存上一个结点。

2、认识LinkedList

我们的LinkedList就是以双向链表实现的。既然它是以链表来实现的,所以也会有链表的基本特性。又因为其是使用双向链表来实现的,所以重点还是在于双向链表的特性

  • 链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。
  • 除了实现List接口外,LinkedList还为在列表的开头及结尾get、remove和insert元素提供了统一的命名方法。这些操作可以将链接列表当作栈,队列和双端队列来使用。

3、从继承关系看LinkedList

为此我们需要先知道LinkedList在整个java集合框架体系里面处于一个什么样的位置。一张图来说明:

2d3cb4b1accd08e77e739e87c6536c58.png

从上面我们发现LinkedList的最根部就是实现了Collection接口。下面我们去掉其他影响集合,从LinkedList为出发点来看继承关系:

701f49f29e15ad88403d3fc3787b6675.png

从上面我们可以看到,LinkedList继承的类与实现的接口如下:

Collection 接口、List 接口、Cloneable 接口、Serializable 接口、Deque 接口(5个接口)

AbstractCollection 类、AbstractList 类、AbstractSequentialList 类(3个类) 。

其中Deque定义了一个线性Collection,支持在两端插入和删除元素。

二、分析LinkedList

在上面从链表到继承关系,我相信你应该对LinkedList有一个基本的了解了。但是下面的分析才是最重要的一环。其实LinkedList中的增删改查操作底层就是基于链表的增删改查的操作,我们可以类比去记忆,然后自己动手去写一个LinkedList

1、Api操作分析

(1)节点Node结构

private 

从上面的node定义,我们就可以看到这是一个双向的链表。

(2)构造方法

public 

(3)增加操作

首先是插入单个节点:

//在尾部插入一个节点: add

增加操作一定会更改modCount,这里面涉及到了fail-fast机制。可以翻看我之前的文章。

(4)删除操作

//remove目标节点

(5)更改操作

public 

(6)查操作

public 

(7)其他操作

public 

2、遍历LinkedList

(1)一般的for循环(随机访问)

int 

(2)for--each循环

for 

(3)迭代器iterator

for

(4)用pollFirst()来遍历LinkedList

while

(5)用pollLast()来遍历LinkedList

while

(6)用removeFirst()来遍历LinkedList

try 

(7)用removeLast()来遍历LinkedList

try 

注意:在链表结构实现的数据集合中,最好采用Iterator或者foreach的方式遍历,效率最高。

小结:

(1)底层实现:LinkedList的实现是基于双向链表的,且头结点中不存放数据

(2)构造方法:无参构造方法直接建立一个仅包含head节点的空链表;包含Collection的构造方法,先调用无参构造方法建立一个空链表,而后将Collection中的数据加入到链表的尾部后面。

(3)查找删除:源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null。

(4)LinkedList是基于链表实现的,因此不存在容量不足的问题,所以这里没有扩容的方法。

(5)LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)。

(6)注意源码中还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用。

dc7ec50a816e1f11cd562a37866d5d73.png

三、linkedList与ArrayList对比分析

下面将对ArrayList与LinkedList进行对比,主要从以下方面进行

相同点

1.接口实现:都实现了List接口,都是线性列表的实现

2.线程安全:都是线程不安全的,都是基于fail-fast机制

不同点

1.底层:ArrayList内部是数组实现,而LinkedList内部实现是双向链表结构

2.接口:ArrayList实现了RandomAccess可以支持随机元素访问,而LinkedList实现了Deque可以当做队列使用

3.性能:新增、删除元素时ArrayList需要使用到拷贝原数组,而LinkedList只需移动指针,查找元素 ArrayList支持随机元素访问,而LinkedList只能一个节点的去遍历

OK,今天的文章就到这,如有问题还请批评指正

想要获取更多文章教程,还请关注微信公众号:java的架构师技术栈,回复关键字可获取计算机系列各种教程资源

9be8615396d99874537913e68a4c7f4b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

meanshift算法 java_Meanshift,聚类算法

记得刚读研究生的时候,学习的第一个算法就是meanshift算法,所以一直记忆犹新,今天和大家分享一下Meanshift算法,如有错误,请在线交流。Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏…

python 数据分析 电信_实例 | 教你用Python写一个电信客户流失预测模型

原标题:实例 | 教你用Python写一个电信客户流失预测模型CDA数据分析师 出品 作者:真达、Mika 数据:真达 【导读】 今天教大家如何用Python写一个电信用户流失预测模型。公众号后台,回复关键字“电信”获取完整数据。 之前我们用Py…

人机融合智能与深度态势感知

来源:人机与认知实验室【“常无欲以观其妙,常有欲以观其徼。”,意思是身处物外可以以旁观者的身份来看待事物,身处事内则要考虑各种极限。】0 引言伴随着深度学习[1]、强化学习[2]等新一代人工智能技术的发展,智能化已…

java大数模板_java大数模板

这几天做了几道用大数的题,发现java来做大数运算十分方便。对acmer来说是十分实用的1.valueOf(parament); 将参数转换为制定的类型比如 int a3;BigInteger bBigInteger.valueOf(a);则b3;String s”12345”;BigInteger cBigInteger.valueOf(s);则c12345;2…

20162317 2016-2017-2 《程序设计与数据结构》第8周学习总结

20162317 2016-2017-2 《程序设计与数据结构》第8周学习总结 教材学习内容总结 1.异常的定义(中断正常指令的事件) 2.异常的特点(异常是对象) 3.异常的分类(CheckedExcception 和 UncheckedException) 4.异…

sql return的用法_【实用技能】Seacms 8.7版本SQL注入分析

有些小伙伴刚刚接触SQL编程,对SQL注入表示不太了解。其实在Web攻防中,SQL注入就是一个技能繁杂项,为了帮助大家能更好的理解和掌握,今天小编将要跟大家分享一下关于Seacms 8.7版本SQL注入分析的内容,一定要认真学习哦。…

国科大UCAS胡包钢教授《信息论与机器学习》课程第二讲:信息论基础一

来源:专知信息论中最为基本的概念就是香农熵(第8页),由此可以导出信息论中其它各种定义,以至我们常规应用的其它经验式定义(以后会提到)。学习信息论基础知识时要避免仅是概念与定义的简单记忆&…

java 翻转句子_Java编程-句子反转

题目描述给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello”输入描述:输入数据有多组,每组占一行&a…

通讯录分组名称大全简单_公司起名取名:建筑公司名称大全简单大气

阅读本文前,请您先点击上面的“蓝色字体”再点击关注,这样您就可以继续免费收取到文章了,每天都有分享,完全是免费订阅,请放心关注。时代在变迁,人们的生活节奏在加快,各类楼盘高低错落&#xf…

java ssl 无证书_java – 如何修复SSL – 没有可用的证书

我想使用以下代码建立服务器SSL套接字连接:int port 12000;ServerSocketFactory ssocketFactory SSLServerSocketFactory.getDefault();ServerSocket ssocket ssocketFactory.createServerSocket(port);// Listen for connectionsSocket socket ssocket.accept(…

美国发布《量子网络战略愿景》

来源:国防科技要闻背景探索如何建立量子网络将促进新兴技术的发展,从而加速当前互联网的发展,提高通信的安全性,并大幅推动计算技术的进步。美国将利用其在量子网络领域的领先地位,加速在国家和金融安全、病人隐私、药…

[bzoj2127]happiness

来自FallDream的博客,未经允许,请勿转载,谢谢。 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自…

python错误代码翻译查询_完成自动查找翻译单词的python源代码

下面这段代码需要完成的是关于完成自动查找翻译单词的python源代码,找到目标单词在网上词典完成翻译的过程。 #!/usr/bin/python #codingutf-8 import urllib import sys #import xml.dom.minidom import re #是否输出例句 egTrue def main(): if len(sys.argv) 2:…

mysql sql实现原理_Mysql的数据库原理

首先要了解原理。不得不说说。mysql的执行流程。Mysql是一个单进程的服务,对于每一个请求都是用线程来相应的。这就需要一个连接器来处理新用户的请求、相应,以及销毁。1.客户端请求,服务端(连接器)开辟线程相应用户2.用户发起SQL语句查询数据…

Jürgen Schmidhuber眼中的深度学习十年,以及下一个十年展望

大数据文摘出品来源:Medium作者:Jrgen Schmidhuber编译:张秋玥、马莉2020年是充满科幻的一年,曾经我们畅想飞行汽车、智能洗碗机器人以及能自动写代码的程序,然而这一切都没有发生。2020迎接我们的是澳洲大火、新冠病毒…

AC日记——数据流中的算法 51nod 1785

数据流中的算法 思路&#xff1a; 线段树模拟&#xff1b; 时间刚刚卡在边界上&#xff0c;有时超时一个点&#xff0c;有时能过&#xff1b; 来&#xff0c;上代码&#xff1a; #include <cstdio> #include <cstring> #include <iostream> #include <alg…

docker pidfile_Zabbix5监控Docker

zabbix_agent配置Zabbix 监控Docker 时 agent 需要使用 zabbix_agent2&#xff0c;而不是zabbix_agent主要模式时配置如下&#xff1a;[rootlocalhost#] cat /etc/zabbix/zabbix_agent2.conf |grep -v ^#|grep -v ^$ PidFile/var/run/zabbix/zabbix_agent2.pidLogFile/var/log…

6种java垃圾回收算法_被说烂了的Java垃圾回收算法,我带来了最“清新脱俗”的详细图解...

一、概况理解Java虚拟机垃圾回收机制的底层原理&#xff0c;是系统调优与线上问题排查的基础&#xff0c;也是一个高级Java程序员的基本功&#xff0c;本文就针对Java垃圾回收这一主题做一些整理与记录。Java垃圾回收器的种类繁多&#xff0c;它们的设计要在吞吐量(内存空间)与…

Gartner:2020 年 AI 平台魔力象限:意外多多

来源&#xff1a;云头条众多企业决策者向市场研究公司Gartner寻求企业软件堆栈方面的建议。魔力象限报告是Gartner发布的最可信、最真实、最权威的研究报告之一。由于它影响企业的采购决策&#xff0c;因此诸多供应商竭力想在报告中占有一席之地。Gartner最近发布了数据科学和机…