一、简介
LinkedList继承自AbstractSequentialList,是List和Deque接口的双向链表实现,其底层维护一个双向链表存储元素。它实现了所有可选的列表操作,并且只能存储同一种引用类型的数据,但是包括null。
LinkedList特点如下:
- 动态扩容
- 非线程安全
- 允许插入的元素重复
- 插入的元素是有序的(即按照添加的先后顺序排序)
- 随机访问速度慢,可以使用下标访问(底层使用双向链表实现,访问元素需要遍历链表)
- 插入和删除速度快(只需要改变相关节点引用的指向即可)
二、构造函数
Method | Description |
---|---|
LinkedList() | 构造一个空列表 |
LinkedList(Collection<? extends E> c) | 按照集合的迭代器返回的顺序构造包含指定集合的元素的列表 |
使用方式如下:
// 构造一个空列表
List<Integer> list = new LinkedList<>();
// 在构造列表时添加元素
List<Integer> list = new LinkedList<>(){{
add(1);
add(2);
add(360);
}};
// 从已有的集合中构造新的列表, 该操作为浅拷贝
List<Integer> newList = new LinkedList<>(list);
三、常用方法
LinkedList类同时实现了List和Deque接口,其关于List接口的方法使用方式类似于ArrayList,这里只讲其关于Deque接口的一些常用方法。
Type | Method | Description |
void | addFirst(E e) | 将元素e添加到列表头部 |
void | addLast(E e) | 将元素e添加到列表尾部 |
E | peek() | 返回头部元素(不删除) |
boolean | offer(E e) | 将元素e添加到列表尾部 |
E | poll() | 删除并返回列表头部元素 |
void | push(E e) | 将元素e添加到列表头部 |
E | pop() | 删除并返回列表头部元素 |
使用LinkedList类实现队列功能:
// 定义一个空队列
Queue<Integer> queue = new LinkedList<>();
// 入队操作,在队尾添加元素(即尾部)
queue.offer(1);
// [1]
System.out.println(queue);
// 入队操作
queue.offer(2);
// [1, 2]
System.out.println(queue);
// 入队操作
queue.offer(3);
// [1, 2, 3]
System.out.println(queue);
// 查看队首元素但是不删除
// 1
System.out.println(queue.peek());
// [1, 2, 3]
System.out.println(queue);
// 出队操作,删除并返回队首元素
// 1
System.out.println(queue.poll());
// [2, 3]
System.out.println(queue);
使用LinkedList类实现栈功能:
// 定义一个空栈
LinkedList<Integer> stack = new LinkedList<>();
// 入栈操作,在栈顶添加元素(即头部)
stack.push(1);
// [1]
System.out.println(stack);
// 入栈操作
stack.push(2);
// [2, 1]
System.out.println(stack);
// 入栈操作
stack.push(3);
// [3, 2, 1]
System.out.println(stack);
// 查看栈顶元素但是不删除
// 3
System.out.println(stack.peek());
// [3, 2, 1]
System.out.println(stack);
// 出栈操作,删除并返回栈顶元素
// 3
System.out.println(stack.pop());
// [2, 1]
System.out.println(stack);