Queue集合
Queue用于模拟队列这种数据结构,队列FIFO的容器。队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素
API
- void add(Object e):将指定元素加入此队列的尾部
- boolean offer(Object e):将指定元素加入队列的尾部,使用有限容量限制的队列时,要优于add方法
- Object element():获取队列头部的元素,但不删除该元素
- Object peek():获取队列头部的元素,但是不删除该元素,如果队列为空,返回Null
- Object poll():获取队列头部的元素,并删除该元素,如果队列为空,返回null
- Object remove():获取队列头部的元素 并删除该元素
add 、offer 都是将指定元素加入尾部,offer要比add更优
element、remove、peek、poll 都是获取头部元素,
element只获取不删除,队列为空调用会抛出NoSuchElementException
peek只获取不删除,如果队列为空返回null
poll获取元素并删除,队列为空返回null
remove获取队列头部元素并删除,如果队列为null会抛出NoSuchElementException
PriorityQueue实现类
PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。当调用peek()方法或者poll()方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素
PriorityQueue<Integer> pq = new PriorityQueue<>();
//添加数据到头部
pq.add(1);
//添加
pq.offer(2);
pq.offer(3);
pq.offer(4);
pq.offer(5);
//获取头部元素 但不删除
System.out.println("element 获取元素" + pq.element());
System.out.println("peek获取元素" + pq.peek());
System.out.println("poll获取元素" + pq.poll());
System.out.println("remove" + pq.remove());
//获取头部元素
System.out.println("集合尺寸" + pq.size());
PriorityQueue不允许插入null元素
PriorityQueue的元素有两种排序方式
- 自然排序:要求PriorityQueue集合中的元素必须实现Comparable接口
- 定制排序 创建PriorityQueue,传入一个Comparator对象。
Deque接口与ArrayDeque实现类
Deque接口是Queue接口的子接口,代表一个双端队列
API
- void addFirst(Object e):将指定元素插入该双端队列的开头 没有返回结果
- void addLast(Object e):将指定元素插入该双端队列的末尾 没有返回结果
- Iterator descendingIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代队列
- Object getFirst() 获取但不删除第一个元素
- Object getLast() 获取但不删除最后一个元素
- boolean offerFirst(Object e):将指定元素插入双端队列的开头
- boolean offerLast(Object e):将指定元素插入该双端队列的末尾
- Object peekFirst():获取但不删除双端队列的第一个元素,如果队列为空,返回Null
- Object peekLast():获取但不删除该双端队列的最后一个元素,如果队列为空,返回Null
- Object pollFirst():获取并删除该双端队列的第一个元素,如果队列为空,返回Null
- Object pollLast():获取并删除该双端队列的最后一个元素,如果队列为空,返回Null
- Object pop():pop出双端队列所表示的栈的栈顶元素,弹栈操作
- void push(Object e):将一个元素push进双端队列所表示的栈的栈顶
- Object removeFirst():获取并删除该双端队列的第一个元素 如果队列为空会抛出异常
- Object removeLast():获取并删除该双端队列的最后一个元素
- Object removeFirstOccurrence(Object o) 删除该双端队列的第一次出现的元素o
- Object removeLastOccurrence(Object o)删除该双端队列的最后一次出现的元素o
Deque不仅可以当成双端队列使用,也可以当成栈来使用
ArrayDeque 实现类
ArrayDeque是一个基于数组实现的双端队列。创建Deque可以指定一个numElements参数,用于指定ObJect[]数组的长度。如果不指定numElements参数,Deque底层数组的长度为16
ArrayDeque<String> stack = new ArrayDeque<>();
stack.push("aaaa");
stack.push("bbbb");
stack.push("cccc");
//弹栈
System.out.println("弹栈" + stack.pop());
//访问第一个元素,但不删除元素
System.out.println("获取"+ stack.peek());
当程序中需要使用”栈“,推荐使用ArrayDeque,尽量避免使用Stack,Stack性能差
LinkedList实现类
LinkedList类是List接口的实现类,除此之外,LinkedList还实现了Deque接口,因此LinkedList可以被当成双端队列来使用。既可以被当做栈来使用,也可以当做队列来使用
各种线性表的性能分析
Java提供的List就是一个线性表接口。基于数组的线性表和基于链的线性表。Queue代表队列,Deque代表了双端队列。
如果要遍历List集合元素,对于ArrayList Vector使用get来遍历集合元素性能更好。对于LinkedList应该采用迭代器来遍历集合更好
如果要经常执行插入、删除操作 由于ArrayList Vector要经常改变底层数组实现的大小,所以使用LinkedList集合性能更好
如果有多个线程需要同时访问List集合中的元素,可以考虑使用线程安全的集合