队列:Queue(单向队列)
- 是集合框架Collection的子接口,是一种常见的数据结构,遵循先进先出的原则。基于链表来进行实现单向队列。LinkedList接口,实现了Queue,所以LinkedList,在插入和删除操作,效率会比较高。
方法:
add(E):boolean 在队尾添加元素,添加成功返回true,如果队列已满无法添加则抛出异常。
offer(E):boolean 在队尾添加元素,添加成功返回true,如果队列已满无法添加则返回false。
remove():E 删除队头元素,并返回删除的元素,如果队列为null,抛出异常。
poll():E 删除队头元素,并返回删除的元素,如果队列为null,返回null。
element():E 获取队头元素,如果队列为null将抛出异常。
peek():E 获取队头元素,如果队列为null将返回null。
Deque接口(双向队列)
Deque接口,是Queue接口的子接口,是指队列两端的元素,既能入队(offer)也能出队。
如果将Deque限制为只能从一端进行入队,和出队,就是栈的数据结构的实现。对于栈而言,有入栈(push)和出栈(pop),遵循先进后出的规则。
方法:
Deque<Integer> deque = new LinkedList<>();
addFirst(E):void 在队头添加元素。
addLast(E):void 在队尾添加元素。
offerFirst(E):boolean 在队头添加元素,并返回是否添加成功。
offerLast(E):boolean 在队尾添加元素,并返回是否添加成功。
removeFirst():E 删除队头元素,并返回删除的元素,如果队列为null,抛出异常。
removeLast():E 删除队尾元素,并返回删除的元素,如果队列为null,抛出异常。
pollFirst():E 删除队头元素,并返回删除的元素,如果队列为null,返回null。
pollLast():E 删除队尾元素,并返回删除的元素,如果队列为null,返回null。
getFirst():E 获取队头元素,如果队列为null将抛出异常。
getLast():E 获取队尾元素,如果队列为null将抛出异常。
peekFirst():E 获取队头元素,如果队列为null将返回null。
peekLast():E 获取队尾元素,如果队列为null将返回null。
removeFirstOccurrence(Object):boolean 删除第一次出现的指定元素,并返回是否删除成功。
removeFirstOccurrence(Object):boolean 删除最后一次出现的指定元素,并返回是否删除成功。
二者的关系:
Deque继承Queue
interface Deque<E> extends Queue<E>
interface Queue<E> extends Collection<E>
栈
方法:
peek():E 获取队头元素,如果队列为null将返回null。
push(E):void 栈顶添加一个元素。
pop():E 移除栈顶元素,返回移除的元素,如果栈没有元素抛出异常。
LinkedList:双向链表
LinkedList实现了Deque接口,Deque接口实现了Queue接口
实现接口:List<E>, Deque<E>, Cloneable, java.io.Serializable
拥有队列和列表的方法,取决于创建的是什么
List的方法:继承自Collection
interface List<E> extends Collection<E>
方法如下:
创建方式:(可以实现双向链表和双端队列)
LinkedList list = new LinkedList(); //双向链表的创建
Deque<Integer> deque = new LinkedList<>(); //双端队列的创建
队列方法:
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.addFirst("X"); //在头部添加元素
list.addLast("Z");
System.out.println(list);
list.removeFirst(); //移除元素
list.removeLast();
list.getFirst(); //获取元素
list.getLast();
list.isEmpty();
ArrayDeque:通过数组实现队列功能
实现接口:Deque<E>, Cloneable, Serializable
创建方式:ArrayDeque queue = new ArrayDeque();
方法:队列的方法,见上图
底层数据存储方式
类型 | 存储方式 |
---|---|
Stack | 长度为10的数组 |
ArrayDeque | 长度为16的数组 |
LinkedList | 链表 |
线程安全
类型 | 线程安全 |
---|---|
Stack | 线程同步、继承于Vector |
ArrayDeque | 线程不同步、实现Deque接口 |
LinkedList | 线程不同步、实现Deque与List接口 |
性能选项
通常情况下,不推荐使用Vector以及其子类Stack
1.需要线程同步 使用Collections工具类中synchronizedXxx()将线程不同步的ArrayDeque以及LinkedList转换成线程同步。
2.频繁的插入、删除操作:LinkedList 3.频繁的随机访问操作:ArrayDeque 4.未知的初始数据量:LinkedList