You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.8 KiB
1.8 KiB
特性
LinkedList
是基于双向链表的结构来存储元素,所以长度没有限制,因此不存在扩容机制- 由于链表的内存地址是非连续的,所以只能从头部或者尾部(采用头插或尾插法)查找元素,查询的时间复杂为
O(n)
,但是 JDK 对LinkedList
做了查找优化,当我们查找某个元素时,若index < (size / 2)
,则从head
往后查找,否则从tail
开始往前查找 , 但是我们在计算时间复杂度的时候,常数项可以省略,故时间复杂度O(n)
- 链表通过指针去访问各个元素,所以插入、删除元素只需要更改指针指向即可,因此插入、删除的时间复杂度
O(1)
- 它是非线程安全的集合
- 通常可以使用ArrayList或ArrayDeque代替,其中ArrayDeque使用数组实现双端队列,由于数组采用连续内存空间,因此效率高于链表
缺点
- 从速度的角度:
ArrayDeque
基于数组实现双端队列,而LinkedList
基于双向链表实现双端队列,数组采用连续的内存地址空间,通过下标索引访问,链表是非连续的内存地址空间,通过指针访问,所以在寻址方面数组的效率高于链表。 - 从内存的角度:虽然
LinkedList
没有扩容的问题,但是插入元素的时候,需要创建一个Node
对象, 换句话说每次都要执行new
操作,当执行new
操作的时候,其过程是非常慢的,会经历两个过程:类加载过程 、对象创建过程。 - 类加载过程
- 会先判断这个类是否已经初始化,如果没有初始化,会执行类的加载过程
- 类的加载过程:加载、验证、准备、解析、初始化等等阶段,之后会执行
<clinit>()
方法,初始化静态变量,执行静态代码块等等