一、LinkedList
LinkedList类是双向列表(底层使用链表结构),列表中的每个节点都包含了对前一个和后一个元素的引用。
1.1特性
- LinkedList是双向链表实现的List
- LinkedList是非线程安全的
- LinkedList元素允许为null,允许重复元素
- LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)LinkedList是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法
- LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用
1.2、方法
offer方法:内部调用offerLast插入元素,返回插入结果true/false
add方法: 内部调用addLast实现
poll方法: 内部调用pollFirst实现
remove方法:内部调用removeFirst实现
peek方法:内部调用peekFirst实现
element方法:内部调用getFirst实现
栈方法:
pop方法: 内部调用removeFirst实现
push方法:内部调用addFirst实现
二、ArrayDeque
ArrayDeque是双端队列的线性实现 (底层使用数组结构)
2.1、特性
- 无容量大小限制,容量按需增长;
- 非线程安全队列,无同步策略,不支持多线程安全访问;
- 当用作栈时,性能优于
Stack
,当用于队列时,性能优于LinkedList
- 两端都可以操作
- 具有fail-fast特征
- 不能存储
null
- 支持双向迭代器遍历
2.2、方法
队列方法:
offer方法:内部调用offerLast插入元素,返回插入结果true/false
add方法: 内部调用addLast实现
poll方法: 内部调用pollFirst实现
remove方法:内部调用removeFirst实现
peek方法:内部调用peekFirst实现
element方法:内部调用getFirst实现
栈方法:
pop方法: 内部调用removeFirst实现
push方法:内部调用addFirst实现
三、PriorityQueue
3.1、PriorityQueue是非线程安全的
Java提供了PriorityBlockingQueue(实现BlockingQueue接口)用于Java多线程环境。
3.2、PriorityQueue天生是小顶堆,那么如果我要大顶堆怎么办?
// 默认实现了一个最小堆。
Queue<Integer> priorityQueue = new PriorityQueue<>();
// 实现最大堆
Queue<ListNode> priorityQueue = new PriorityQueue<ListNode>(
lists.size(),
new Comparator<ListNode>(){
@Override
public int compare(ListNode o1, ListNode o2) { return o2.val-o1.val; }
}
);
参考文章
ArrayDeque详解_MrCoderr的博客
力扣刷题常用数据结构和方法(java版本)