新元素插入到队列的尾部,访问元素操作会返回队列头部的元素,通常队列不允许随机访问队列中的元素
Queue接口定义的几个方法:
void add(obj):将指定元素加入队列尾部
Object element():获取头元素,但不删除
boolean offer(obj):将指定元素加入队列尾部,当使用有容量限制的队列时,此方法表现的比add要好
Object peek():获取头元素,但不删除该元素,队列为空则返回null
Object poll():获取头元素并删除,如果队列为空泽返回null
Object remove():获取队列头部元素,并删除该元素
Queue接口有一个PriorityQueue实现类和一个Deque接口
Deque代表双端队列,可以同时两端添加删除元素,既可以当队列使用,也可以当栈使用。有两个实现类:ArrayDeque,LinkedList
PriorityQueue类:
是一个比较标准的队列实现类,说比较标准是因为PriorityQueue保存队列元素的顺序不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序,因此当调用peek或者poll方法取出队列中元素时,不是最先进入的元素,而是最小的元素,这里违反了先进先出规则,大小比较受到PriorityQueue的toString方法影响。不允许插入null
有两种排序方式:
自然排序:集合元素必须实现了Comparable接口
定制排序:创建PriorityQueue队列时,传入一个Comparator对象
对元素的要求与TreeSet基本一致
Deque接口:
代表双端队列,包含下面方法:
void addFirst(obj):指定元素插入开头
void addLast(obj):插入结尾
Iterator descendingIterator():返回双端队列对应迭代器,该迭代器逆向顺序迭代队列中的元素
Object getFirst():获取但不删除第一个
Object getLast():获取但不删除最后一个
boolean offerFirst(obj):插入开头
boolean offerLast(obj):插入末尾
Object peekFirst():获取但不删除第一个元素,如果队列为空则null
Object peekLast():获取但不删除最后一个元素,如果队列为空则null
Object pollFirst():获取并删除第一个元素,如果队列为空则null
Object pollLast():获取并删除最后一个元素,如果队列为空则null
Object pop():(栈方法)pop出栈顶元素,相当于removeFirst
void push(obj):(栈方法)push到栈顶,相当于addFirst
Object removeFirst():获取并删除双端队列第一个元素
boolean removeFirstOccurrence(obj):删除双端队列第一次出现的元素
Object removeLast():获取并删除双端队列最后一个元素
boolean removeLastOccurrence(obj):删除该双端队列最后一次出现的元素
ArrayDeque实现类:
是Deque的实现类,基于数组实现的双端队列
创建Deque同样可以指定一个numElements参数,用于指定Object[]数组的长度,不指定则Deque底层数组长度为16
用栈用ArrayDeque,避免用Stack,也可以当做队列使用:ArrayDeque stack = new ArrayDeque()
ArrayList和ArrayDeque实现机制基本相同,底层都采用一个动态的,可分配的Object[]数组来存储集合,超出容量则重新分配一个数组
LinkedList实现类:
是List接口的实现类,也实现了Deque接口,因此可以当做双端队列使用,可以当做队列使用。也可以当做栈使用
LinkedList与ArrayList和ArrayDeque实现机制完全不同,后两者以数组形式保存集合中的元素,因此随机访问具有很好的性能,当LinkedList以链表形式,随机访问性能较差,插入删除出色
Vector也是以数组形式存储,但实现了线程同步,所以各方面性能都差