当前位置:网站首页>用了这么多年的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 -
边栏推荐
猜你喜欢
随机推荐
Controller层代码这么写,简洁又优雅!
The CTF command execution subject their thinking
2022山东国际青少年眼睛健康产业展会,视力健康展,眼视光展
一个很少见但很有用的SQL功能
B站回应“HR 称核心用户都是 Loser”:该面试官去年底已被劝退,会吸取教训加强管理
scala 集合通用方法
学习Autodock分子对接
threejs dynamically adjust the camera position so that the camera can see the object exactly
B站回应HR称用户是Loser:涉事面试官去年底已被劝退
【C语言】带头双向循环链表(list)详解(定义、增、删、查、改)
程序员常说的“左手锟斤拷,右手烫烫烫”是怎么回事?
js基础知识整理之 —— 全局作用域
CAS:474922-22-0,DSPE-PEG-MAL,磷脂-聚乙二醇-马来酰亚胺科研试剂供应
DownMusic summary record
CIO修炼手册:成功晋升CIO的七个秘诀
2022暑假牛客多校1 (A/G/D/I)
21天学习挑战赛(1)设备树的由来
airflow db init 报错
学习基因富集工具DAVID(3)
redis的学习笔记