集合List LinkedList源码分析

type
status
date
slug
summary
tags
category
icon
password

前言

LinkedListJava中双向链表的实现,它实现了List接口并且允许内部元素为空,学过数据结构的同学很清楚,讲数据结构时第一个学的是数组接下来是链表,老师会把链表和数组做对比他们都属于线性数据结构,并且实现上各有千秋,简单来说如下
  • ArrayList:增删效率低,但是改查效率高
  • LinkedList:增删效率高,但是该查效率低

时间复杂度

Ops
Time Complexity
prepend
O(1)
append
O(1)
lookup
O(n)
insert
O(1)
delete
O(1)

变量

构造函数

总结

  • LinkedList中比较复杂难理解的函数是addAll
概括的说,LinkedList 是线程不安全的,允许元素为null的双向链表。 其底层数据结构是链表,它实现List<E>, Deque<E>, Cloneable, java.io.Serializable接口,它实现了Deque<E>,所以它也可以作为一个双端队列。和ArrayList比,没有实现RandomAccess所以其以下标,随机访问元素速度较慢。
因其底层数据结构是链表,所以可想而知,它的增删只需要移动指针即可,故时间效率较高。不需要批量扩容,也不需要预留空间,所以空间效率比ArrayList高。
缺点就是需要随机访问元素时,时间效率很低,虽然底层在根据下标查询Node的时候,会根据index判断目标Node在前半段还是后半段,然后决定是顺序还是逆序查询,以提升时间效率。不过随着n的增大,总体时间效率依然很低。
当每次增、删时,都会修改modCount
  • LinkedList 是双向列表。
    • 链表批量增加,是靠for循环遍历原数组,依次执行插入节点操作。对比ArrayList是通过System.arraycopy完成批量增加的。增加一定会修改modCount。
    • 通过下标获取某个node 的时候,(add select),会根据index处于前半段还是后半段 进行一个折半,以提升查询效率
    • 删也一定会修改modCount。 按下标删,也是先根据index找到Node,然后去链表上unlink掉这个Node。 按元素删,会先去遍历链表寻找是否有该Node,考虑到允许null值,所以会遍历两遍,然后再去unlink它。
    • 改也是先根据index找到Node,然后替换值。改不修改modCount。
    • 查本身就是根据index找到Node。
    • 所以它的CRUD操作里,都设计到根据index去找到Node的操作。
Loading...

© ShellMing 2019-2025