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.

12 lines
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>()` 方法,初始化静态变量,执行静态代码块等等