用了这么多年的LinkedList,作者说自己从来不用它?为什么?

老规矩,先来看一下目录:

一、概述

概述: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它存在性能与安全问题,所以在实际项目中是很少会用到的。

三、我们学不学?用不用?

我想,此时的你看源码可能有几个目的:

  1. 应付面试,在面试的时候面试官老爱问看过xxx底层源码没
  2. 做知识储备,弄懂底层原理,更能理解与架构上层应用
  3. 学习优秀的思想与设计
  4. 别问,问就是逼格高

有人这样认为:有一句话叫“不要重复造轮子”,所以可以不用去了解其底层,直接使用即可。

但我想说的是,如果你都不知道底层是怎么实现的,你又从何而知自己是在造轮子呢?

所以这个顺序应该是:首先知道轮子的底层原理实现,其次自己正准备做一个一模一样的轮子,才有“不要重复造轮子”。

小结:我们应该学习其底层优秀的思想与设计,同时“不要重复造轮子”。

四、如何使用?

原理设计图

源码分析:增

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 -

猜你喜欢

转载自blog.csdn.net/Trouvailless/article/details/126120372