Queue接口及其实现类(ArrayDeque和LinkedList)
- Queue接口是collection的子接口,是以先进先出的方式排列元素
- Deque接口实现双端队列,ArrayDeque和LinkedList是它的两个实现类
- ArrayDeque类是可变数组的实现,不可存储null。LinkedList是线性表的实现,实现了线性表的所有操作,可存储null
- PriorityDeque实现的是一种优先队列,优先队列中的元素顺序是根据元素的值排列的
- 下面程序演示了ArrayDeque类的使用,实现双端队列
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Iterator;
/**
* Queue接口是collection的子接口,是以先进先出的方式排列元素
* Deque接口实现双端队列,ArrayDeque和LinkedList是它的两个实现类
* ArrayDeque类是可变数组的实现,不可存储null。LinkedList是线性表的实现,实现了线性表的唆所有操作,可存储null
* PriorityDeque实现的是一种优先队列,优先队列中的元素顺序是根据元素的值排列的
* 下面程序演示了ArrayQueue类的使用,实现双端队列
*/
public class DequeDemo {
public static void main(String[] args){
int [] elements = {1,2,3,0,7,8,9} ;
Deque<Integer> queue = new ArrayDeque<>() ; //实例化
queue.addFirst(5) ;//将元素5添加到队列的头部
for(int i=0; i<3; i++){ //将数组的前三个元素依次添加到queue中的头部
queue.addFirst(elements[i]) ;
}
for(int j=4; j<7; j++){ //将数组的后3个元素添加到队列的尾部
queue.addLast(elements[j]) ;
}
for(Integer m : queue){ //输出队列的元素 3,2,1,5,7,8,9
System.out.print(m + " ") ;
}
System.out.println("size = " + queue.size()) ; //输出队列的大小7
queue.add(10) ;//向队列中添加元素10
System.out.println(queue.element()) ; //输入队列的对头元素3
queue.remove() ; //返回队列的队头元素,同时将其移除
queue.offer(11) ;//将指定元素11插入队列queue
queue.offerFirst(6) ; //将指定元素6插入对头
queue.poll() ;//返回队头元素,并将其删除
System.out.println(queue.peek()) ; //返队头元素,但不将其删除
Iterator <Integer> iterator = queue.iterator() ;
while(iterator.hasNext()){ //使用迭代器方式打印队列元素
System.out.print(iterator.next() + " ") ;
}
System.out.println() ;
System.out.println(queue.getFirst() + " " + queue.getLast()) ;//得到队列的队头元素和队尾元素
}
}
- 队列的实现类一般不允许插入null元素,但LinkedLis类是一个例外,它允许null元素
- 如果需要经常在线性表的头部添加元素或者内部删除元素,就应该使用LinkedList类
- LinkedList同时实现了List接口和Queue接口
- 下面程序使用LinkedList类实现一个10s的倒计时
import java.util.LinkedList;
import java.util.Queue;
/**
* 队列的实现类一般不允许插入null元素,但LinkedLis类是一个例外,它允许null元素
* 如果需要经常在线性表的头部添加元素或者内部删除元素,就应该使用LinkedList类
* LinkedList同时实现了List接口和Queue接口
* 下面程序使用LinkedList类实现一个10s的倒计时
*/
public class CountDown {
public static void main(String[] args){
int time = 10 ;
Queue <Integer> queue = new LinkedList<>() ; //实例化
for(int i=time; i>0; i--) { //从10到1依次存储到队列中
queue.add(i);
}
while (!queue.isEmpty()) { //队列非空时循环
System.out.println(queue.remove()); //返回队头元素,并将其删除
try { //线程沉睡时间为1000ms
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}