LinkedList介绍
1. LinkedList 简介
LinkedList是双向链表,大致长下面的样子
1.1 实现细节
基于JDK 1.8版本;
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
1.1.1 实现和继承关系
- 继承 抽象类AbstractSequentialList,它也可以被当作堆栈、队列或双端队列进行操作;
- 实现 List 接口,能对它进行队列操作。
- 实现 Cloneable接口,即覆盖了clone()方法,能被克隆;
- 实现 java.io.Serializable 接口,支持序列化,能通过序列化去传输;
- 实现 Deque 接口,即能将LinkedList当作双端队列使用
[继承关系]
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractList<E>
↳ java.util.AbstractSequentialList<E>
↳ java.util.LinkedList<E>
1.1.2 底层实现
1.1.2.1 主要成员
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
//链表由递归构成,双向节点存在一个prev的指向,指向上一个节点;
//以及一个next的指向,指向下一个节点;
//E item 说明保存的元素类型为泛型类型;
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
1.1.2.2 方法分类
LinkedList实现了List和Deque接口,源代码中具备了实现List和Queue的特性;
重点来看下LinkedList是如何实现栈(Stack)和Queue(队列)的功能的,主要体现在它的方法分类上:
- LinkedList中等效 Queue方法
| Queue队列方法 | LinkedList等效方法 | 作用 | 返回值 | 非空判断 |
| —- | —- | —- | —- | —- |
| add(e) | addLast(e) | 队列尾部添加元素 | void | false |
| offer(e) | offerLast(e) | 队列尾部添加元素 | boolean | false |
| remove() | removeFirst() | 移除队列头部元素 | 泛型E | true |
| poll() | pollFirst() | 移除队列头部元素 | 泛型E | false |
| element() | getFirst() | 获取队列头部元素 | 泛型E | true |
| peek() | peekFirst() | 获取队列头部元素 | 泛型E | false |
- LinkedList中等效Stack的方法
| Stack栈方法 | LinkedList等效方法 | 实质调用 | 作用 | 返回值 | 非空判断 |
| —- | —- | —- | —- | —- | —- |
| push(e) | push(e) | addFirst | 栈中压入元素 | void | false |
| pop(e) | pop(e) | removeFirst | 栈中弹出元素 | void | false |
| peek(e) | peek(e) | peek(e) | 获取队列头部元素 | void | false |
2. LinkedList 高级特性
- LinkedList线程不安全性
- LinkedList模拟队列,栈实现数据结构操作(TODO :之后遇到会调重点的举例说明)