一、 Queue(队列):
队列是一个典型的先进先出(FIFO)的容器。即从容器的另一端放入事物,从另一端取出来。并且放入的顺序与 取出的顺序是相同的。所以队列常被当做一种可靠的将对象从程序的某个区域传输到另一个区域的途径。队列在并发编程中特别重要。
1.LinkedList间接的实现了Queue接口:
LinkedList实现的Deque接口继承字Queue,<br /> **LinkedList部分源码;**
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable{}
public interface Deque<E> extends Queue<E>{}
所以说LinkedList的一些方法能够支持队列的行为,同时通过将LinkedList向上转型为Queue还可以将其用作Queue的一种实现。<br /> **示例:**
public class QueueDemo {
public static void printQ(Queue queue){
while (queue.peek()!=null){
System.out.println(queue.remove()+" ");
}
}
public static void main(String[] args) {
Queue<Integer> queue=new LinkedList<>();//向上转型为Queue
Random random = new Random();
for (int i = 0; i < 10; i++) {
queue.offer(random.nextInt(i+10));
}
printQ(queue);
Queue<Character> qc=new LinkedList<>();
for (char c : "Bromntosaurus".toCharArray()) {
qc.offer(c);
}
printQ(qc);
}
}
OutPut:
1 10 6 3 7 12 2 6 16 7 B r o m n t o s a u r u s
示例详解-与queue相关的方法
1.offer(); 在允许的条件下将元素查到队尾,或者返回flase. 2.peek()和element(); 两者都时在不移除对头的情况下将其返回,但peek在队列为空时返回null,element则抛出NoSuchElementException异常 3.pool和remove(); 两者都时在移除对头的情况下将其返回,但pool在队列为空时返回null,remove则抛出NoSuchElementException异常
2.PriortyQueue(优先队列)
优先队列声明下一个弹出的元素是最需要的元素。当我们调用peek()、pool()和remove()方法时,将按照我们定义的排序规则取出最优先的对象。
class Users implements Comparable<Users>{
private static int counter = 0;
private final int id = counter++;
final int priority;
public Users(int priority) {
this.priority = priority;
}
public void info(){
System.out.println("我的优先级为:"+priority);
}
public String toString() {
return"Users"+ "(id : " + id + " priority: " + priority + ")";
}
public int compareTo(Users arg) {
return priority < arg.priority ? 1 :
(priority > arg.priority ? -1 : 0);
}
}
public class PrioritityDemo{
public static void main(String[] args) {
PriorityQueue<Users> priorityQueue1 = new PriorityQueue<>();
for (int i = 0; i <5 ; i++) {
priorityQueue1.add(new Users(i));
}
while (priorityQueue1.peek()!=null){
Users remove = priorityQueue1.remove();
remove.info();
}
PriorityQueue<Users> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
for (int i = 0; i <5 ; i++) {
priorityQueue.add(new Users(i));
}
System.out.println("Collections.reverseOrder()反序排列");
while (priorityQueue.peek()!=null){
Users remove = priorityQueue.remove();
remove.info();
}
}
}
Output:
我的优先级为:4
我的优先级为:3
我的优先级为:2
我的优先级为:1
我的优先级为:0
Collections.reverseOrder()反序排列
我的优先级为:0
我的优先级为:1
我的优先级为:2
我的优先级为:3
我的优先级为:4
如果在PriorityQueue构造器中传入Collections.reverseOrder()那么队列中的对象将安装你定义的规则去反向排序