当前位置:网站首页>用了这么多年的LinkedList,作者说自己从来不用它?为什么?
用了这么多年的LinkedList,作者说自己从来不用它?为什么?
2022-08-02 22:51:00 【Trouvailless】
老规矩,先来看一下目录:
一、概述
概述:LinkedList是一个双向链表的数据结构,所以它实现了Queue、List接口,继承关系如下:
二、为什么作者不用?
LinkedList是JDK1.2发布的,作者是Josh Bloch,简单介绍一下这位大佬。
Josh Bloch是 Java 集合框架创办人,Joshua Bloch 领导了很多 Java 平台特性的设计和实现,包括 JDK 5.0 语言增强以及屡获殊荣的 Java 集合框架。2004年6月他离开了SUN公司并成为 Google 的首席 Java 架构师,另外他还因为《Effective Java》一书获得著名的 Jolt 大奖。
为什么自己写的LinkedList自己却从来不用呢?这不就相当于:鹅厂的员工说自己从来不用微信吗?我的第一反应就是:不可能!
不过话又说回来,仔细想想自己在平时的工作中有用过吗?答案是没有。
在平时的工作中都是用的ArrayList,确实从来没有用过LinkedList!
大家也不用惊慌,作者还说了很多,让我们来看看:
作者:有人真的使用LinkedList吗?我写的,我从来没用过。
CE:我只是在非常罕见的情况下才这么做
NYW:我记得有些地方认为这是小型列表的好做法。
VS:我从TreeMap的源码中看到过它
作者:Doug Lea与我合著了TreeMap,我们确实使用了它。
IF:我想用过好几次,但它几乎没能在构思阶段存活下来
JR:链表在函数式语言中更受关注,例如Scala中默认的seq实现是链表。
作者:不要误会我的意思;我喜欢链表。它们在 C 中和在 Scheme 中一样有用。但 LinkedList 完全是另一回事。
JR:我想当我需要一个堆栈时,我用过一两次LinkedList。
作者:ArrayDeque 是一个很棒的堆栈、队列或双端队列。
CD:我在一个到处都有他们的项目工作。
B:ArrayList对每个人来说都足够了
UB:当我需要Java中的链表时,我总是发现自己用函数式实现它比使用LinkedList更容易
G:我在 10 多年中使用过几次。
DD:永远不要使用它。大多数时候使用 Array*。
小结:其实,作者的回答也非常明确了,LinkedList是基于双向链表实现的双端队列,链表和队列都是非常好的数据结构,但是在Java中LinkedList它存在性能与安全问题,所以在实际项目中是很少会用到的。
三、我们学不学?用不用?
我想,此时的你看源码可能有几个目的:
- 应付面试,在面试的时候面试官老爱问看过xxx底层源码没
- 做知识储备,弄懂底层原理,更能理解与架构上层应用
- 学习优秀的思想与设计
- 别问,问就是逼格高
有人这样认为:有一句话叫“不要重复造轮子”,所以可以不用去了解其底层,直接使用即可。
但我想说的是,如果你都不知道底层是怎么实现的,你又从何而知自己是在造轮子呢?
所以这个顺序应该是:首先知道轮子的底层原理实现,其次自己正准备做一个一模一样的轮子,才有“不要重复造轮子”。
小结:我们应该学习其底层优秀的思想与设计,同时“不要重复造轮子”。
四、如何使用?
原理设计图
源码分析:增
1、头插法addFirst:
1、动画理解头插法addFirst:
2、尾插法addLast:
2、动画理解尾插法addLast:
3、最常见的add:
源码分析:删
1、删除头节点:
1、动画理解删除头节点:
2、删除尾节点:
3、根据参数匹配删除:
3、动画理解根据参数匹配删除:
源码分析:改
源码分析:查
1、查找头节点getFirst:
2、查找尾节点getLast:
3、查找第x个节点:
node(int index)方法在上面已经分析过了哦~
五、性能如何?
关于性能这块,一般都是拿着LinkedList与ArrayList进行对比,网上有很多关于它们之间的比较,但是它们真的能比吗?
ArrayList对LinkedList : 老哥,我们来比较随机访问的性能吧!
LinkedList反怼了一句 : 哼,随机访问我实在是太慢了,要比咱们就比头节点插入!
ArrayList也撇嘴说 : 头节点插入是我的硬伤...把球给我,我要回家。
ArrayList与LinkedList真的能比吗?能比,但是必须建立在同一个需求的基础上,比如说:这个需求是每次都在最中间的位置插入节点;这个需求是每次都在最后面添加元素等等。所以对于性能的实践,李哥在这里就不多阐述了,留给以后做需求的你吧。
- END -
边栏推荐
猜你喜欢
Shunted Self-Attention via Multi-Scale Token Aggregation
Jmeter secondary development to realize rsa encryption
FastCorrect:语音识别快速纠错模型丨RTC Dev Meetup
【C语言】带头双向循环链表(list)详解(定义、增、删、查、改)
Mysql查看慢查询日志
WebShell 木马免杀过WAF
脂溶性胆固醇-聚乙二醇-叠氮,Cholesterol-PEG-Azide,CLS-PEG-N3
精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
数据库主键一定要自增吗?有哪些场景不建议自增?
浅读一下dotenv的主干逻辑的源码
随机推荐
FastCorrect:语音识别快速纠错模型丨RTC Dev Meetup
threejs dynamically adjust the camera position so that the camera can see the object exactly
DownMusic总结记录
ROS2初级知识(9):bag记录过程数据和重放
1 - vector R language self-study
Based on two levels of decomposition and the length of the memory network multi-step combined forecasting model of short-term wind speed
精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
Week 7 - Distributional Representations
Shunted Self-Attention via Multi-Scale Token Aggregation
基于飞腾平台的嵌入式解决方案案例集 1.0 正式发布!
智能电视竞争白热化,利用小程序共建生态突围
Jmeter secondary development to realize rsa encryption
GameStop NFT 市场分析
IDO代币预售合约系统开发技术详细
ZCMU--5230: 排练方阵(C语言)
同一份数据,Redis为什么要存两次?
Yocto系列讲解[实战篇]85 - 制作ubi镜像和自动挂载ubifs文件系统
TCP三次握手与四次挥手
CTF命令执行题目解题思路
Mysql查看慢查询日志